2013-06-03 24 views
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 

在第二输出我认为整数的范围crossed.But为什么它给-ve number.It需要给我一个error.What给乘法在java中的负值是这样做的原因行为?整数使用正数

在此先感谢...

+0

为什么downvote.give我是谁打倒了这个投票说 – PSR

+3

任何理由给予downvote是不正确的 – PSR

+3

我没有downvote的原因,但我理解他们为什么会:这是不是真正的问题解决一个真正的问题。这只是编程的一个基本误解。101.整数溢出不会在Java中引发异常。 –

回答

9

您溢出了一个32位整数的大小。

考虑一下,当我是发生了什么等于10:

sum = sum + 100000000000 //1 with 11 zeroes 

但是可以存储在一个32位整数的最大正数仅约2十亿(2九零)。

事实上,它变得更糟糕!中间计算将精度有限的执行,并尽快为10 * 10 * 10 * 10乘法......溢出,那么10秒就会有一个奇怪的负数相乘,并已经错了。

所以你最终不会似乎遵循算术的任何规则,但实际上它非常有意义,一旦你知道那原始的整数具有有限的存储数量。

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

+0

当我用长而不是int它是好的。但我想知道reasson – PSR

+0

@PSR这就是我的理由 – Patashu

+0

我明白了。谢谢你的快速回复 – PSR

1

您正在使用的基本类型。所以,当一个整数溢出时,它只会打印出其中包含的负数。如果您想要错误,请尝试整数。

1

当你预测,你通过了整数范围内,尽管引起无限值(如符号[最高位]被感动)。

5

爪哇整数数学定义为签署二进制补模2^32(对于int)和2^64(长)。所以任何时候int乘法的结果都是2^31或更高,它会绕过并变成负数。这只是java中整数运算的方式。

Java spec

+0

这更像是处理器的工作方式 –

+0

将很高兴添加对http://en.wikipedia.org/wiki/Two%27s_complement的参考 –

+0

@DenisTulskiy:添加了相关参考 –