嗨,所以我最近看到很多结构这样的问题
int a= (int) Math.pow(2,32);
System.out.println(a); //prints out Integer.MAX_VALUE
之后,我回答了这个问题原来我听错了,我回答Integer.MIN_VALUE的,但正确答案是Integer.MAX_VALUE的。进一步的测试之后,我意识到任何双,我转换为int大于Integer.MAX_VALUE的只是使INT等于Integer.MAX_VALUE的。例如
int a = (int) ((double) Integer.MAX_VALUE+100);
System.out.println(a); //prints out Integer.MAX_VALUE
进一步的测试后,我意识到,如果你尝试投下长长的为int,似乎为int分配给一个看似随机数。
所以我的问题是。究竟发生了什么事,为什么双值不是当你把它转换为int溢出的整数?而为什么铸造长为int返回一个看似随机数
这些转换的逻辑是Java语言规范,Item 5.1.3的一部分。
你可以看到有,从长时转换为int,最显著位被丢弃,留下至少显著32位。
而且,如果四舍五入一个double
或float
的结果是一个数字,是过小或过大,以表示作为int
(或long
),最小或最大可表示数将被选择。
有没有办法让我们在这里回答“为什么”的已经在很久以前的决定。但是,这是语言的定义方式,你可以依靠它正在你的工作,任何Java环境相同。
用于铸造双重价值为整数,将点值后擦除和其余像舍去双重的价值,并在第一个问题中的int将返回值也可能保存在8个叮咬所以它似乎是所述min.value长= Math.pow(2,32);会给你的Max.value等于和铸造长整数这不是一个随机数。这是隆多的最右边32位对不起,我写不好英语是我的第二语言