我试图获得长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);
答案 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
。