Java 为什么长250000000溢出?

Java 为什么长250000000溢出?,java,long-integer,integer-overflow,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。根据: 如果整数乘法溢出,则结果是数学乘积的低阶位,如某些足够大的2的补码格式所示。因此,如果发生溢出,则结果的符号

我的理解是java中的long的最大值为2^63-1。你知道为什么在长时间内存储50000^2=2500000000时,考虑到2500000000小于2^63-1,我得到-1794967296吗?谢谢

    long l = 50000 * 50000;
    System.out.println(l);
我预计产量为2500000000,但实际产量为-1794967296。

根据:

如果整数乘法溢出,则结果是数学乘积的低阶位,如某些足够大的2的补码格式所示。因此,如果发生溢出,则结果的符号可能与两个操作数值的数学乘积的符号不同

您将两个溢出的整数相乘,然后将结果存储在long中,这没有帮助

您必须显式使用长文字:

 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

请参阅,以了解为什么只显式使用一个long literal或对long进行一次转换就足够了。

这不是long overflow,而是在执行int乘法时的int overflow。您使用的是整型文字,而不是长型文字。50000*50000!=50000L*50000L在哪里进行int加法?50000是int-literal,不长,因此您正在执行int*int,它也是int,无论使用和接收的值如何,这就是发生溢出的原因。试试50000L*50000L。成功了。如何对变量执行此操作?例:长l=50000;长n=l*l;