整数使用正数在乘法中给出负值

时间:2013-06-03 04:01:30

标签: java integer

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 个答案:

答案 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中的工作方式。

Java spec

答案 2 :(得分:1)

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

答案 3 :(得分:1)

正如您预测的那样,您传递了整数范围,但会导致无限值(因为符号[最高位]被触摸)。