1

我有以下声明:

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++ 的行为方式也一样吗?

4

2 回答 2

6

假设a * b * c适合 a long,但a * b不适合int-

  • 正如您所怀疑的那样,您的第一个片段会溢出,因为a * b进入了一个临时的。int
  • 正如您所声称的,您的第二个片段不会产生溢出,因为它long在每个点乘以值。
  • 您的第三个片段不会溢出,因为它还long在每个点乘以值。

而且,是的,C 和 C++ 也都以这种方式工作。尽管取决于平台,它们对于int和的长度可能不同long

于 2013-10-20T22:40:15.340 回答
2

有关运算符优先级,请参阅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);
    }
}

它们显示完全相同的输出。

相反,在第二个版本中删除演员表,你会得到一个溢出。

于 2013-10-20T22:32:50.740 回答