public class Test {
public static void main(String[] args) {
int sum=0;
for(int i=1;i<10;i++)
sum = sum+i*i*i*i*i*i*i*i*i*i;
System.out.println(sum);
}
}
OUTPUT:619374629
for(int i=1;i<10;i++)
sum = sum+i*i*i*i*i*i*i*i*i*i*i;
System.out.println(sum);
OUTPUT:
-585353335
在第二个输出中我认为整数范围越过。但是为什么它给出-ve
数字。它需要给我一个错误。这个行为的原因是什么?
提前致谢...
答案 0 :(得分:9)
你已经溢出了32位整数的大小。
考虑当我等于10时会发生什么:
sum = sum + 100000000000 //1 with 11 zeroes
但是可以存储在32位整数中的最大正数只有大约20亿(2个有9个零)。
事实上,它变得更糟!中间计算将以有限的精度执行,并且一旦10 * 10 * 10 * 10 ...的乘法溢出,则10s将乘以奇怪的负数,并且已经错误。
所以你最终得到的数字似乎并不遵循任何算术规则,但事实上,一旦你知道原始整数的存储量有限,它就非常有意义。
解决方案是使用64位long
并希望你也不会溢出,如果你这样做,则需要BigInteger
。
答案 1 :(得分:5)
Java将整数数学定义为带符号的2s-complement mod 2 ^ 32(对于int)和2 ^ 64(对于long)。因此,只要int乘法的结果是2 ^ 31或更高,它就会回绕并变为负数。这就是整数数学在java中的工作方式。
答案 2 :(得分:1)
您正在使用原始类型。因此,当一个整数溢出时,它只会打印出包含在其中的位为负数。如果您想要错误,请尝试整数。
答案 3 :(得分:1)
正如您预测的那样,您传递了整数范围,但会导致无限值(因为符号[最高位]被触摸)。