我有一个Java程序来显示原始整数数据类型的限制,如下所示:
import static java.lang.Math.*;
class HelloWorld {
public static void main(String[] args) {
System.out.println((byte)Math.pow(2,8-1));
System.out.println((byte)(Math.pow(2,8-1)-1));
System.out.println((short)(pow(2,16-1)));
System.out.println((short)(pow(2,16-1)-1));
System.out.println((int)(pow(2,32-1)));
System.out.println((int)(pow(2,32-1)-1));
System.out.println((long)(pow(2,64-1)));
System.out.println((long)(pow(2,64-1)-1));
}
}
其输出如下:
-128
127
-32768
32767
2147483647
2147483647
9223372036854775807
9223372036854775807
您能解释一下为什么会输出 int 和 long 类型转换吗?
我期待类似的事情
-128
127
-32768
32767
-2147483648
2147483647
-9223372036854775808
9223372036854775807
您正在转换为“整数”类型
after
,您减去1
。对于整数和长整型,浮点值会根据 1
的减法进行调整,超出这些类型可以容纳的精度。因此,转换为 int 或 long 不包括该特定差异。
这是长转换的示例。
double result1 = Math.pow(2,64-1);
double result2 = Math.pow(2,64-1)-1;
System.out.println(result1);
System.out.println(result2);
long bits = Double.doubleToRawLongBits(result1);
System.out.println(bits);
System.out.println(Long.toBinaryString(bits));
bits = Double.doubleToRawLongBits(result2);
System.out.println(bits);
System.out.println(Long.toBinaryString(bits));
打印
9.223372036854776E18
9.223372036854776E18
4890909195324358656
100001111100000000000000000000000000000000000000000000000000000
4890909195324358656
100001111100000000000000000000000000000000000000000000000000000
请注意,这些值是相同的。由于精度损失,减法没有产生任何影响。对于整数来说也是如此。这种精度差异不会影响较短宽度的类型。