Java Mysterious Long Overflow

时间:2015-01-01 07:17:02

标签: java file math io jvm

我试图获得长2 GB的字节来测试文件大小。尽管被分配到Long,结果似乎仍然溢出。这对我没有任何意义,因为在long的定义中,最大值是2 ^(63)-1,远大于2 * 1024 ^ 3。我觉得它与使用Integer的JVM优化有关,但后来我不确定如何解决这个问题。我应该如何施展它以免它溢出?

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

3 个答案:

答案 0 :(得分:6)

long l = 2 * 1024 * 1024 * 1024;

您在这里初始化 int ,而不是long

如果没有后缀,默认情况下数字积分文字为int

你想写:

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

第一个文字就足够long,算术运算的结果也是long

答案 1 :(得分:1)

将数字附加L以表示它们在语句中显式为长值:

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

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

答案 2 :(得分:1)

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

long l = 2 * 1024 * 1024 * 1024;
首先评估

2 * 1024 * 1024 * 1024,然后将结果分配给l。由于RHS表达式是纯粹的整数,因此将其评估为整数(您将其视为溢出),然后将其分配给LHS上的变量。

将表达式更改为

2L * 1024 * 1024 * 1024,其正确评估为Long