【问题标题】:Why is long 2500000000 overflowing?为什么 long 2500000000 溢出?
【发布时间】:2019-05-07 01:17:11
【问题描述】:

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

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

我预计输出为 2500000000,但实际输出为 -1794967296。

【问题讨论】:

  • 这不是长溢出,它是 int 溢出,因为您正在执行 int 乘法。您使用的是 int 文字,而不是 long 文字。
  • 50000 * 50000 != 50000L * 50000L
  • int 加法发生在哪里?
  • 50000int 文字而不是 long 所以你正在做 int * int 这也是 int (无论使用和接收的值如何,这就是发生溢出的原因)。试试50000L*50000L
  • 好的。那行得通。我如何为变量做到这一点?例如:长 l = 50000;长 n = l * l;

标签: java long-integer integer-overflow


【解决方案1】:

根据Java Language Specification

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

您将两个溢出的整数相乘,然后将结果存储在 long 中,这无济于事。

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

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

或在乘法前转换为 long:

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

请参阅spec 了解为什么只显式使用一个 long 字面量或一个转换为 long 就足够了。

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多