簽名整數溢位

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