Java 从双精度和长精度到整数的铸造细节

Java 从双精度和长精度到整数的铸造细节,java,casting,integer,double,long-integer,Java,Casting,Integer,Double,Long Integer,嗨,我最近看到了一个类似这样的问题 int a= (int) Math.pow(2,32); System.out.println(a); //prints out Integer.MAX_VALUE 在我回答了这个问题之后,我发现我弄错了,我回答了Integer.MIN_值,但正确的答案是Integer.MAX_值。在进一步测试之后,我意识到我转换为大于Integer.MAX_值的int的任何double只会使int等于Integer.MAX_值。 比如说 int a = (int) ((d

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

int a= (int) Math.pow(2,32);
System.out.println(a); //prints out Integer.MAX_VALUE
在我回答了这个问题之后,我发现我弄错了,我回答了Integer.MIN_值,但正确的答案是Integer.MAX_值。在进一步测试之后,我意识到我转换为大于Integer.MAX_值的int的任何double只会使int等于Integer.MAX_值。 比如说

int a = (int) ((double) Integer.MAX_VALUE+100);
System.out.println(a); //prints out Integer.MAX_VALUE
经过进一步的测试,我意识到如果你试图将long转换为int,那么似乎会将int赋值为一个看似随机的数字


所以我的问题是。到底是怎么回事,为什么当您将双精度值转换为int时,它不会溢出整数?为什么将long转换为int会返回一个看似随机的数字呢?如果将double值转换为integer,则会删除after point值,而余数就像是将double值舍入一样 对于第一个问题,int将返回它可以保存在8位中的值,因此它似乎是min.value 长a=数学。pow2,32;会给你最大值
对于将long转换为整数,它不是一个随机数。它是长数字中最右边的32位 对不起,我写得不好
英语是我的第二语言

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

您可以看到,当从long转换为int时,最高有效位被丢弃,留下最低有效位32位

而且,如果双精度或浮点四舍五入的结果是一个太小或太大而不能表示为int或long的数字,那么将选择最小或最大可表示数字


我们在这里无法回答为什么要作出一项早已作出的决定。但这就是语言的定义方式,您可以相信它在任何Java环境中都是一样的。

这不是一个随机数。它是最右边的32位,我猜双精度转换包含类似if int_val>Integer.MAX_VALUE{return Integer.MAX_VALUE;}的代码,当然C中除外。您是否尝试过查看开放JDK项目中的源代码?