Moh*_*taf 3 java bit-manipulation type-conversion
为什么在情况 2:Java 7 中,相同的值会出现两个不同的答案?
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
System.out.println("Case 1:");
long size=(long)1<<39;
System.out.println("size :"+size);
size=1024*1024*1024*512l;
System.out.println("size :"+size);
System.out.println("Case 2:");
size=(long)1<<41;
System.out.println("size :"+size);
size=1024*1024*1024*1024*2l;
System.out.println("size :"+size);
}
}
Run Code Online (Sandbox Code Playgroud)
下面从 Ideone 给出了答案。
Case 1:
size :549755813888
size :549755813888
Case 2:
size :2199023255552
size :0
Run Code Online (Sandbox Code Playgroud)
你看到零的原因是因为它是一个整数溢出。在这个确切的场景中,您触发了JLS 乘法运算符,它指出低端位将是溢出的结果。
例如
System.out.println((1025*1024*1024*1024*2));
System.out.println(Integer.toBinaryString(1025*1024*1024*1024*2));
Run Code Online (Sandbox Code Playgroud)
会打印出来
-2147483648 // Integer overflow
10000000000000000000000000000000 // Integer overflow
Run Code Online (Sandbox Code Playgroud)
在你的情况下
System.out.println((1024*1024*1024*1024*2));
System.out.println(Integer.toBinaryString(1024*1024*1024*1024*2));
Run Code Online (Sandbox Code Playgroud)
它会打印出来
0 // still a overflow, but the lower ordered bits are 0, since we dont see trailing zero bits
0
Run Code Online (Sandbox Code Playgroud)
所以到底发生了什么是你的计算从一个整数开始
size=1024*1024*1024*1024*2l;
Run Code Online (Sandbox Code Playgroud)
如果你不说它很长,它就不会处理它。要修复它,您必须在第一个操作数中使用大写L或小写l。
size=1024L*1024*1024*1024*2l;
System.out.println((1024L*1024*1024*1024*2l));
System.out.println(Integer.toBinaryString(1024L*1024*1024*1024*2l)); // will not work, because the compiler knows it's a long
System.out.println(Long.toBinaryString(1024L*1024*1024*1024*2l));
Run Code Online (Sandbox Code Playgroud)
结果是
2199023255552 // long value
100000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |