混乱关于Java中的溢出

use*_*405 1 c c++ java

我有以下声明:

long result = a * b * c;
Run Code Online (Sandbox Code Playgroud)

这会导致变量结果溢出.那样做:

long result = (long)a * b * c;
Run Code Online (Sandbox Code Playgroud)

但是当它们崩溃时,它们不会:

long result = a;
result *= b;
result *= c;
Run Code Online (Sandbox Code Playgroud)

a和b的类型是int.

有人可以解释为什么会这样吗?在前两种情况下,Java是否将中间结果存储在临时内部int变量中?

C和C++的行为方式也一样吗?

Daw*_*ica 6

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

  • 您的第一个片段会溢出,因为您怀疑a * b是临时的int.
  • 您声称,您的第二个代码段不会溢出,因为它会long在每个点上乘以值.
  • 您的第三个代码段不会溢出,因为它也会long在每个点上乘以值.

而且,是的,C和C++也都这样工作; 虽然根据不同的平台,他们可能有两种不同的长度intlong.