如果intA * intB結果足夠大,則會在2^31邊界處溢出,您不會意外得到預期的結果。爲什麼這兩行會產生不同的溢出行爲?
int64_t value = (intA * intB) - int64A
然而,這產生了預期的值。
int value = (intA * intB) - int64A
這是怎麼回事在較低水平,這意味着存儲在一個int相同的(壞)操作做正確的事情,但在的int64_t它不?
如果intA * intB結果足夠大,則會在2^31邊界處溢出,您不會意外得到預期的結果。爲什麼這兩行會產生不同的溢出行爲?
int64_t value = (intA * intB) - int64A
然而,這產生了預期的值。
int value = (intA * intB) - int64A
這是怎麼回事在較低水平,這意味着存儲在一個int相同的(壞)操作做正確的事情,但在的int64_t它不?
這是未定義的行爲。 Signed overflow is undefined.未定義表示可能發生任何事情,包括程序工作正常。
要超越標準邊界並解釋未定義行爲的特定實例行爲方式,您需要低級別信息,如GCC版本和體系結構。
帶符號整數溢出會導致未定義的行爲。您可能會在您的機器上獲得預期的價值,但不要依賴它。它可能會在其他機器上崩潰,或者給出錯誤的答案。
什麼是有可能發生的是,你的機器上,int
服從模運算模2^32的法律,從int64_t
到int
轉換簡單地取餘數模2^32(丟棄高序位)。因此,如果期望值適合於int
,那就是您得到的值,但是如果將其存儲在int64_t
中,則高位是垃圾。