问题描述
考虑:
long y = 1;
for (int i = 49; i > 43; i--) {
y*= i;
}
long x = 49*48*47*46*45*44; // = 1478412928
long y // = 10068347520
尽管计算是偶数的,为什么结果会有所不同?
有解释吗?
解决方法
49*48*47*46*45*44
是int
文字的乘法,因此执行int
乘法,得到一个int
值。在这种情况下(由于结果大于Integer.MAX_VALUE
)会溢出,然后再将结果分配给long
变量。因此结果不正确。
将其更改为49L*48*47*46*45*44
或(long)49*48*47*46*45*44
以执行long
乘法。
另一方面,在您的第一个计算中,您从一个long
变量开始,其值为1
,循环将long
与int
乘以每次迭代都执行long
乘法,因此不会发生溢出。