有符號/無符號整數溢位的意外結果
在 C中,整數溢位可能會導致意外結果,取決於資料類型的符號性.
考慮以下程序:
#include <iostream> int main() { int x(0); std::cout << x << std::endl; x = x + 2147483647; std::cout << x << std::endl; x = x + 1; std::cout << x << std::endl; std::cout << std::endl; unsigned int y(0); std::cout << y << std::endl; y = y + 4294967295; std::cout << y << std::endl; y = y + 1; std::cout << y << std::endl; }
這個程式的輸出可能會讓你大吃一驚:
0 2147483647 -2147483648 0 4294967295 0
解釋
對於有符號整數,溢位行為是未定義的。在大多數實作中,使用 2 的補碼,這會導致意外的環繞行為。例如,在上面的程式中:
對於 無符號整數,溢位是明確定義的並且圍繞著模 2位元 進行環繞。換句話說,當溢出最大值時,該值被重置為0。這解釋了 y 的輸出,其中 y 在溢出最大無符號值 4294967295 後迴繞到 0。
需要注意的是,有符號整數溢位的行為不受語言保證,並且可能會因語言而異實作和機器架構。因此,通常不建議在程序中依賴此類行為。
以上是為什麼 C 中的整數溢位會導致有符號和無符號整數的不同結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!