正解:
x = -1;
-1超出無符號整型x的表達范圍,根據標准(C++11 section 4.7.2),-1將被轉化為2^n-1(n為x的bit數)。
不正解:
x = 0xFFFFFFFF;
這只適用於32bit整型。
不正解:
x = ~0;
這個被很多書認定為「標准答案」的解答也是錯的。C/C++標准支持原碼/反碼/補碼三種負數表示形式,只有在補碼環境下才會得到正確結果。(例如在反碼下,~0將得到-0,-0轉為無符號仍然是0)
那麼x = ~0u呢?
仍然是錯的。根據標准(C++11 section 2.14.2.2),字面量0u是unsigned int。那麼取反後得到的是UINT_MAX,如果x可表示的最大值不是UINT_MAX那麼結果就是錯的。
2^31-1
可以,但是結果會出錯,負數在計算機中最高位為1,作為符號標志(正數為0),但是如果賦給無符號整型變量,最高位的標志位就會變成數值位,計算時把這個1當成數值。