为什么在情况 2:Java 7 中,相同的值会出现两个不同的答案?

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)

Mur*_*göz 5

你看到零的原因是因为它是一个整数溢出。在这个确切的场景中,您触发了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)