我的理解是,java中的long的最大值为2 ^ 63-1。有什么想法为什么当长时间存储50000 ^ 2 = 2500000000时,如果2500000000小于2 ^ 63-1我会得到-1794967296?谢谢
long l = 50000 * 50000;
System.out.println(l);
我希望输出为2500000000,但实际输出为-1794967296。
答案 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,了解为什么仅显式使用一个长文字或一个长整型铸造就足够了。