嗨,我最近看到了一个类似这样的问题
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会返回看似随机的数字
答案 0 :(得分:1)
这些转换的逻辑是Java语言规范Item 5.1.3的一部分。
您可以在那里看到,从long转换为int时,最高有效位被丢弃,而最低有效32位保留。
此外,如果四舍五入double
或float
的结果是一个太小或太大而无法表示为int
(或long
),将选择最小或最大可表示数字。
对于这里早已做出的决定,我们这里没有办法回答“为什么”。但这是定义语言的方式,您可以依靠它在工作的任何Java环境中都使用相同的语言。
答案 1 :(得分:0)
将双精度值转换为整数会删除后点值,其余的值类似于四舍五入的双精度值 对于第一个问题,int将返回它可以保存为8位的值,因此它似乎是min.value long a = Math.pow(2,32);会给你最大的价值 并将其强制转换为整数这不是一个随机数。它是长号最右边的32位 对不起,我写得不好 英语是我的第二语言