物件的型別決定物件的取值。這會引起乙個疑問:當我們試著把乙個超出其取值範圍的值賦給乙個指定型別的物件時,結果會怎樣呢?答案取決於這種型別是signed 還是unsigned 的。
對於unsigned 型別來說,編譯器必須調整越界值使其滿足要求。編譯器會將該值對unsigned 型別的可能取值數目求模,然後取所得值。比如8 位的unsigned char ,其取值範圍從0 到255 (包括255 )。如果賦給超出這個範圍的值,那麼編譯器將會取該值對256 求模後的值。例如,如果試圖將336 儲存到8 位的unsigned char 中,則實際賦值為80 ,因為80 是336 對256 求模後的值。
對於unsigned 型別來說,負數總是超出其取值範圍。unsigned 型別的物件可能永遠不會儲存負數。有些語言中將負數賦給unsigned 型別是非法的,但在c++ 中這是合法的。c++ 中,把負值賦給unsigned 物件是完全合法的,其結果是該負數對該型別的取值個數求模後的值。所以,如果把-1 賦給8 位的unsigned char ,那麼結果是255 ,因為255 是-1 對256 求模後的值。當將超過取值範圍的值賦給signed 型別時,由編譯器決定實際賦的值。在實際操作中,很多的編譯器處理signed 型別的方式和unsigned 型別類似。也就是說,賦值時是取該值對該型別取值數目求模後的值。然而我們不能保證編譯器都會這樣處理signed 型別。
無符號整型賦值陷阱
有沒有人嘗試過將負數賦給乙個無符號整型變數?知不知道這樣做會發生什麼?還沒有嘗試的就讓我們來探索下無符號整型隱藏的秘密。先來看看下面 int main 執行的結果 4294967295 請按任意鍵繼續.你可能禁不住驚嘆 這麼大!沒想到吧,把乙個負數賦值給無符號整型變數,會產生這麼大的數!為啥呢?好,...
無符號整型賦值陷阱
有沒有人嘗試過將負數賦給乙個無符號整型變數?知不知道這樣做會發生什麼?還沒有嘗試的就讓我們來探索下無符號整型隱藏的秘密。先來看看下面 int main 執行的結果 4294967295 請按任意鍵繼續.你可能禁不住驚嘆 這麼大!沒想到吧,把乙個負數賦值給無符號整型變數,會產生這麼大的數!為啥呢?好,...
無符號整型賦值陷阱
有沒有人嘗試過將負數賦給乙個無符號整型變數?知不知道這樣做會發生什麼?還沒有嘗試的就讓我們來探索下無符號整型隱藏的秘密。先來看看下面 int main 執行的結果 4294967295 請按任意鍵繼續.你可能禁不住驚嘆 這麼大!沒想到吧,把乙個負數賦值給無符號整型變數,會產生這麼大的數!為啥呢?好,...