2013-06-03 26 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:添加了相關參考 –