4
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需要给我一个错误。这种行为的原因是什么?

提前致谢...

4

4 回答 4

11

您已经溢出了 32 位整数的大小。

考虑当 i 等于 10 时会发生什么:

sum = sum + 100000000000 //1 with 11 zeroes

但是可以存储在 32 位整数中的最大正数只有 20 亿左右(2 有 9 个零)。

事实上,情况会变得更糟!中间计算将以有限的精度执行,一旦 10*10*10*10... 的乘法溢出,那么 10 将与一个奇怪的负数相乘,并且已经是错误的。

所以你最终得到的数字似乎没有遵循任何算术规则,但事实上,一旦你知道原始整数的存储空间有限,它就非常有意义。

解决方案是使用 64 位long,希望你不要溢出 THAT,如果你这样做了,那么你需要BigInteger.

于 2013-06-03T04:04:41.590 回答
6

Java 将整数数学定义为有符号 2s-complement mod 2^32(对于 int)和 2^64(对于 long)。因此,只要 int 乘法的结果为 2^31 或更高,它就会回绕并变成负数。这就是整数数学在 java 中的工作方式。

Java 规范

于 2013-06-03T04:10:56.647 回答
1

您正在使用原始类型。因此,当整数溢出时,它只会打印出其中包含的负数位。如果您想要错误,请尝试整数。

于 2013-06-03T04:04:41.650 回答
1

正如您所预测的那样,您通过了整数范围,尽管导致了无限值(因为符号 [最高位] 被触及)。

于 2013-06-03T04:06:31.737 回答