当我在JVM中运行以下代码时,我无法理解它为什么会这样。根据我的理解,< x
运算符应该转到x-1
。
public class LongQuestion {
public static void main(String[] args) {
if(9223372036854775807L < Math.pow(2,63)) {
System.out.println("True"); // DOES NOT GET PRINTED
}
if(9223372036854775807L <= Math.pow(2,63) - 1 ) {
System.out.println("Also True"); // THIS GETS PRINTED
}
}
}
我想知道为什么Java是这样的。
发布于 2020-02-16 02:52:16
Math.pow
被声明为
public static double pow(double a, double b)
所以我们要处理的是替身。Math.pow(2,63)
是"2.0d ^ 63.0d
“(power,不是eor)。由于double
总共为64位,因此更改低于最高有效位的60个奇数位的值不会改变该值。所以Math.pow(2,63) == Math.pow(2,63) - 1
,也就是(double)9223372036854775807L
。
在第一个if
中隐含地进行隐式强制转换。
if((double)9223372036854775807L < Math.pow(2.0d,63.0d)) {
System.out.println("True"); // DOES NOT GET PRINTED
}
<
的左边和右边都是9.223372036854776E18
,所以是false
。
https://stackoverflow.com/questions/60242023
复制相似问题