java - 乘法发生溢出

标签 java multiplication integer-overflow

long m = 24 * 60 * 60 * 1000 * 1000;

上面的代码造成了溢出并且没有打印出正确的结果。

long m2 = 24L * 60 * 60 * 1000 * 1000;
long m3 = 24 * 60 * 60 * 1000 * 1000L;

以上两行打印出正确的结果。

我的问题是-

  1. m2m3 对我使用的编译器有影响吗?
  2. 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。最后,使用 m2m3 完成分配。

是的,乘法的结合性从左到右 - 意味着先取左操作数。基于这个事实,我认为在这种情况下我们应该使用 -

long m2 = 24L * 60 * 60 * 1000 * 1000;  

这个语句,因为在这个语句中,对 long 的提升发生得更早,这降低了溢出的风险。

关于java - 乘法发生溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30606365/

相关文章:

c++ - 根据Fermat的小定理未获得预期的输出

javascript - 在 Javascript 中乘以 float 时,这是否是处理舍入错误的可靠方法?

c++ - 计算(64 位无符号整数)*(64 位无符号整数)除以 2^64 的商

c - 使用带有 uint64_t 类型的内置溢出函数

java - 简单模表达式

java - 在享元模式中将静态实例分配给非静态实例

java - 所有 Android 类的实际基类是什么?

java - 将参数传递给自定义条件

c - 设置为 CHAR_MAX 的字符值是否保证环绕到 CHAR_MIN?

c - 如何处理 "((9^x)-2)%5"而不会在更高的 x 处溢出?