2016-01-29 126 views
1

如果intA * intB結果足夠大,則會在2^31邊界處溢出,您不會意外得到預期的結果。爲什麼這兩行會產生不同的溢出行爲?

int64_t value = (intA * intB) - int64A

然而,這產生了預期的值。

int value = (intA * intB) - int64A

這是怎麼回事在較低水平,這意味着存儲在一個int相同的(壞)操作做正確的事情,但在的int64_t它不?

回答

6

這是未定義的行爲。 Signed overflow is undefined.未定義表示可能發生任何事情,包括程序工作正常。

要超越標準邊界並解釋未定義行爲的特定實例行爲方式,您需要低級別信息,如GCC版本和體系結構。

1

帶符號整數溢出會導致未定義的行爲。您可能會在您的機器上獲得預期的價值,但不要依賴它。它可能會在其他機器上崩潰,或者給出錯誤的答案。

什麼是有可能發生的是,你的機器上,int服從模運算模2^32的法律,從int64_tint轉換簡單地取餘數模2^32(丟棄高序位)。因此,如果期望值適合於int,那就是您得到的值,但是如果將其存儲在int64_t中,則高位是垃圾。

相關問題