从double和long转换为int的细节

时间:2019-02-06 15:46:48

标签: java casting integer double long-integer

嗨,我最近看到了一个类似这样的问题

int a= (int) Math.pow(2,32);
System.out.println(a); //prints out Integer.MAX_VALUE

在我回答了问题之后,事实证明我弄错了,我回答了Integer.MIN_VALUE,但正确的答案是Integer.MAX_VALUE。经过进一步的测试,我发现我强制转换为大于Integer.MAX_VALUE的int的任何double都只是使int等于Integer.MAX_VALUE。 例如

int a = (int) ((double) Integer.MAX_VALUE+100);
System.out.println(a); //prints out Integer.MAX_VALUE

进一步测试后,我意识到如果尝试将long转换为int,则似乎会将int分配给了一个看似随机的数字。

所以我的问题是。到底发生了什么,当将整数转换为整数时,为什么double值不会溢出整数?以及为什么将long转换为int会返回看似随机的数字

2 个答案:

答案 0 :(得分:1)

这些转换的逻辑是Java语言规范Item 5.1.3的一部分。

您可以在那里看到,从long转换为int时,最高有效位被丢弃,而最低有效32位保留。

此外,如果四舍五入doublefloat的结果是一个太小或太大而无法表示为int(或long ),将选择最小或最大可表示数字。

对于这里早已做出的决定,我们这里没有办法回答“为什么”。但这是定义语言的方式,您可以依靠它在工作的任何Java环境中都使用相同的语言。

答案 1 :(得分:0)

将双精度值转换为整数会删除后点值,其余的值类似于四舍五入的双精度值 对于第一个问题,int将返回它可以保存为8位的值,因此它似乎是min.value long a = Math.pow(2,32);会给你最大的价值 并将其强制转换为整数这不是一个随机数。它是长号最右边的32位 对不起,我写得不好 英语是我的第二语言