簽名整數溢位
int x = INT_MAX + 1;
// x can be anything -> Undefined behavior
如果在評估表示式期間,結果未在數學上定義或未在其型別的可表示值範圍內,則行為未定義。
(C++ 11 標準第 5/4 段)
這是一個比較討厭的問題,因為它通常會產生可重現的,非崩潰的行為,因此開發人員可能會很大程度上依賴於觀察到的行為。
另一方面:
unsigned int x = UINT_MAX + 1;
// x is 0
因為:
宣告無符號的無符號整數應遵守算術模數
2^n
的定律,其中n
是該特定整數大小的值表示中的位數。
(C++ 11 標準第 3.9.1 / 4 段)
有時編譯器可能會利用未定義的行為並進行優化
signed int x ;
if(x > x + 1)
{
//do something
}
這裡由於沒有定義有符號整數溢位,編譯器可以自由地假設它可能永遠不會發生,因此它可以優化掉 if
塊