我有以下声明:
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
适合 long
,但 a * b
不适合 int
-
- 您的第一个代码段会溢出,因为
a * b
进入临时int
,正如您所怀疑的那样。 - 您的第二个代码段不会像您声称的那样出现溢出,因为它在每个点乘以
long
值。 - 您的第三个代码段没有溢出,因为它还在每个点乘以
long
值。
而且,是的,C 和 C++ 也都以这种方式工作;尽管根据平台的不同,int
和 long
的长度可能不同。
关于java - 关于 Java 溢出的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19483580/