long m = 24 * 60 * 60 * 1000 * 1000;
上面的代码造成了溢出并且没有打印出正确的结果。
long m2 = 24L * 60 * 60 * 1000 * 1000;
long m3 = 24 * 60 * 60 * 1000 * 1000L;
以上两行打印出正确的结果。
我的问题是-
m2
或m3
对我使用的编译器有影响吗?- java 是如何开始繁殖的?从左到右还是从右到左?是先计算 24*60 还是先计算 1000*1000?
最佳答案
在这种情况下——
long m = 24 * 60 * 60 * 1000 * 1000;
赋值权先求值。右边没有long
类型的数据。都是int
。因此 JVM
尝试将结果放入 int
中,然后发生溢出。
在第二种情况下——
long m2 = 24L * 60 * 60 * 1000 * 1000;
long m3 = 24 * 60 * 60 * 1000 * 1000L;
这里乘法的一个操作数是long
。所以其他人会自动提示long
。结果试图适应 long
。最后,使用 m2
和 m3
完成分配。
是的,乘法的结合性从左到右 - 意味着先取左操作数。基于这个事实,我认为在这种情况下我们应该使用 -
long m2 = 24L * 60 * 60 * 1000 * 1000;
这个语句,因为在这个语句中,对 long
的提升发生得更早,这降低了溢出的风险。
关于java - 乘法发生溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30606365/