Java神秘长溢出

Java Mysterious Long Overflow

我正在尝试获取一个长 2 GB 的字节来测试文件大小。尽管分配给 Long,结果似乎溢出了。这对我来说没有任何意义,因为在 long 的定义中,最大值是 2^(63)-1,这比 2 * 1024^3 大得多。我感觉它与使用 Integers 的 JVM 优化有关,但我不确定如何解决这个问题。我应该如何投射它才不会溢出?

long l = 2 * 1024 * 1024 * 1024;
    System.out.println(l);
    System.exit(0);
long l = 2 * 1024 * 1024 * 1024;

您正在此处初始化 int,而不是 long!

不加后缀时,整数字面量默认为int.

您想写:

// NOTE THE L SUFFIX
long l = 2L * 1024 * 1024 * 1024;

first 字面值是 long 就足以使算术运算的结果也是 long

在数字后附加 L 以表明它们是在语句中明确表示的长值:

long l = 2L * 1024L * 1024L * 1024L;

否则,表达式中的值将被视为整数,然后简单地分配给一个 long。

人们正确地指出了这个问题。这里同样重要的是评估顺序。在表达式中

long l = 2 * 1024 * 1024 * 1024;

2 * 1024 * 1024 * 1024 先求值,然后将结果赋值给 l。由于 RHS 表达式是纯整数,因此将其计算为整数(您看到的是 overflow),然后分配给 LHS 上的变量。

当您将表达式更改为

2L * 1024 * 1024 * 1024,其正确计算为 Long