2011-12-16 48 views
4

我正在處理一些古老的Delphi代碼,我遇到了一些我不太明白的東西。奇怪的德爾福整數乘法行爲

[bla is set to 130245932] 

outresult := ((bla * 1103516849) + 12359); 

[outresult is equal to -413953101] 

乘兩個正數如何導致負數?爲什麼它,當我把喇嘛變量的方程,只是直接使用整數(像這樣)

outresult := ((130245932 * 1103516849) + 12359); 

我收到錯誤的應用程序甚至編譯

[DCC Error] Unit1.pas(60): E2099 Overflow in conversion or arithmetic operation 

一些天才之前將不勝感激。謝謝。

+8

谷歌:「整數溢出」 – Mysticial 2011-12-16 00:23:01

回答

11

好的,我會將其作爲答案。

錯誤信息應該很清楚。您有一個整數溢出的位置:

130245932 * 1103516849 

因爲130245932 * 1103516849 = 143728580475708268這是太大,無法進入32位整數。

6

它基於內存在系統中的表現方式。基本上,你每個整數只有32位。對於有符號的整數,標誌使用一位;這給你一個從負數到正數2^31(約20億)的數值範圍。如果你超出這個範圍,系統就會崩潰。

如果您需要大整數,請嘗試使用Int64而不是integer。如果您需要比這更大的整數,請檢查BigInteger中的類型DeHL.

2

你看到一個整數溢出,我想你可能會對你看到的具體結果感到好奇。

你的初始乘法

(130245932 * 1103516849)= 143728580475708268

...導致整數溢出,並在32位數學所產生的 「環繞式」 生成:

( 143728580475708268模2^32) - 2^32 = -413965460

...然後輸入等式增加12359:

-413965460 + 123 59 = -413953101(你看到的結果,Q.E.D.

希望這有助於