我有以下声明:
long result = a * b * c;
这会导致变量结果溢出。也是如此:
long result = (long)a * b * c;
但是当分解时,它们不会:
long result = a;
result *= b;
result *= c;
a 和 b 的类型是int。
有人可以解释为什么会这样吗?在前两种情况下,Java 是否将中间结果存储在临时内部 int 变量中?
C 和 C++ 的行为方式也一样吗?
假设a * b * c适合 a long,但a * b不适合int-
a * b进入了一个临时的。intlong在每个点乘以值。long在每个点乘以值。而且,是的,C 和 C++ 也都以这种方式工作。尽管取决于平台,它们对于int和的长度可能不同long。
有关运算符优先级,请参阅Oracle 文档。
一元的优先级高于乘法,因此(long)a*b*c也是(long)(a)*b*c。
在C++中也一样。
我刚刚测试了这些程序:
public class JavaApplication2 {
public static void main(String[] args) {
long l = (long)Integer.MAX_VALUE;
l *= 2;
l *= 2;
System.out.println(l);
}
}
和
public class JavaApplication2 {
public static void main(String[] args) {
long l = (long)Integer.MAX_VALUE*2*2;
System.out.println(l);
}
}
它们显示完全相同的输出。
相反,在第二个版本中删除演员表,你会得到一个溢出。