我有以下声明:
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
进入了一个临时的。int
long
在每个点乘以值。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);
}
}
它们显示完全相同的输出。
相反,在第二个版本中删除演员表,你会得到一个溢出。