为什么25亿多溢满了?

时间:2019-05-07 01:17:11

标签: java long-integer integer-overflow

我的理解是,java中的long的最大值为2 ^ 63-1。有什么想法为什么当长时间存储50000 ^ 2 = 2500000000时,如果2500000000小于2 ^ 63-1我会得到-1794967296?谢谢

    long l = 50000 * 50000;
    System.out.println(l);

我希望输出为2500000000,但实际输出为-1794967296。

1 个答案:

答案 0 :(得分:1)

根据Java Language Specification

  

如果整数乘法溢出,则结果是数学乘积的低阶位,以某种足够大的二进制补码格式表示。结果,如果发生溢出,则结果的符号可能与两个操作数值的数学乘积的符号不同。

您要乘以溢出的整数,然后将结果存储为长整数,这将无济于事。

您要么必须显式使用长文字:

 long l = 50000L * 50000L;
 long l = 50000L * 50000; // this also works

或在相乘之前强制转换为

 long l = ((long) 50000) * ((long)50000);
 long l = ((long) 50000) * 50000; // this also works

请参见spec,了解为什么仅显式使用一个长文字或一个长整型铸造就足够了。