C 中整數溢位的意外結果
使用整數類型時,了解溢位的意義至關重要。在這篇文章中,我們將探討為什麼有符號和無符號整數溢位會在 C 程式中產生意外結果。
考慮以下測試整數溢位的程序:
輸出令人驚訝:
有符號整數溢位
有符號整數溢位是未定義的行為。這意味著編譯器可以做任何它想做的事情,包括產生像本例一樣的錯誤結果。
無符號整數溢位
相較之下,無符號整數溢位很好-定義。該值環繞,類似於除以 2^bits 的模數(其中,bits 是資料類型中的位數)。由於我們有一個32 位元int:
具體實作細節
儘管有符號整數溢位是未定義的行為,但大多數實作都使用2的補碼表示。這解釋了在該程式中觀察到的具體結果:
加 1時POS_MAX:
由於設定了前導位,因此它是負數。為了找出實際值,我們執行 2 的補碼逆:
因此,最終值為 -8,出現在程式的輸出中。
以上是為什麼整數溢位會在 C 中產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!