当我在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
。
发布于 2020-02-16 02:56:12
以下代码将帮助您理解它:
public class Main {
public static void main(String[] args) {
System.out.println("Long.MAX_VALUE is " + Long.MAX_VALUE);
System.out.println("Math.pow(2, 63) is " + Math.pow(2, 63));
System.out.println("Math.pow(2, 63) - 1 is " + (Math.pow(2, 63) - 1));
System.out.println("(long)Math.pow(2, 63) is " + (long) Math.pow(2, 63));
System.out.println("(long)(Math.pow(2, 63) - 1) is " + (long) (Math.pow(2, 63) - 1));
if (9223372036854775807L < Math.pow(2, 63)) {
System.out.println("9223372036854775807L < Math.pow(2, 63)");
}
if (9223372036854775807L <= Math.pow(2, 63)) {
System.out.println("9223372036854775807L <= Math.pow(2, 63)");
}
if (9223372036854775807L <= Math.pow(2, 63) - 1) {
System.out.println("9223372036854775807L <= Math.pow(2, 63) - 1");
}
if (9223372036854775807L < (long) Math.pow(2, 63)) {
System.out.println("9223372036854775807L < (long)Math.pow(2, 63)");
}
if (9223372036854775807L <= (long) Math.pow(2, 63)) {
System.out.println("9223372036854775807L <= (long)Math.pow(2, 63)");
}
if (9223372036854775807L <= (long) Math.pow(2, 63) - 1) {
System.out.println("9223372036854775807L <= (long)Math.pow(2, 63) - 1");
}
if (9223372036854775807L <= (long) (Math.pow(2, 63) - 1)) {
System.out.println("9223372036854775807L <= (long)(Math.pow(2, 63) - 1)");
}
}
}
输出:
Long.MAX_VALUE is 9223372036854775807
Math.pow(2, 63) is 9.223372036854776E18
Math.pow(2, 63) - 1 is 9.223372036854776E18
(long)Math.pow(2, 63) is 9223372036854775807
(long)(Math.pow(2, 63) - 1) is 9223372036854775807
9223372036854775807L <= Math.pow(2, 63)
9223372036854775807L <= Math.pow(2, 63) - 1
9223372036854775807L <= (long)Math.pow(2, 63)
9223372036854775807L <= (long)(Math.pow(2, 63) - 1)
https://stackoverflow.com/questions/60242023
复制相似问题