負數賦值給無符號數的陷阱

2022-02-12 07:44:19 字數 942 閱讀 3658

有沒有人嘗試過將負數賦給乙個無符號整型變數?知不知道這樣做會發生什麼?還沒有嘗試的就讓我們來探索下無符號整型隱藏的秘密。

先來看看下面**:

int main()

執行的結果:

4294967295

請按任意鍵繼續. . .

你可能禁不住驚嘆:這麼大!沒想到吧,把乙個負數賦值給無符號整型變數,會產生這麼大的數!為啥呢?好,我們一步步分析:

首先,仔細觀察輸出的結果4294967295,發現4294967295=2^32-1,哦!好像有點規律!但是,又為啥會是這樣?讓我們先來討論下int和unsigned int的表現形式,其中他倆都是4個位元組,32位的二進位制表示,但int有一位是符號位,unsigned則沒有。那-1的int型別表示為1000 0000 0000 0000 0000 0000 0000 0001,那麼將其強制轉換成unsigned int 應該是1000 0000 0000 0000 0000 0000 0000 0001(紅色為符號位),用指數表示是2^31+1,而不是2^32-1!這是怎麼回事呢?(*^__^*) 嘻嘻……,這裡還隱藏著乙個小秘密!那就是int在真正儲存在記憶體中的二進位制數不是值的原碼,而是其補碼(為了便於運算,可以參考《數字邏輯》)!那麼在強制型別轉換之前,int變數-1記憶體中儲存的是1111 1111 1111 1111 1111 1111 1111 1111,等於2^32-1。soso在強轉為unsigned int時,就是讀取該塊記憶體的值賦給變數!這樣val就變成了4294967295,超級大的數!所以各位同仁在處理unsigned int 賦值時一定要謹慎!如果出錯將影響甚大,因為unsigned int一般都會作為for或while迴圈體的標識型別,如果將負值賦給它,將導致嚴重的假死迴圈!痛哉!痛哉!例如以下**:

for(unsigned u=10;u>=0;u--)

u永遠也不會小於0,迴圈條件將一直成立!!!

遠離陷阱,珍惜生命!o(∩_∩)o哈哈~

負數賦值給無符號數的陷阱

有沒有人嘗試過將負數賦給乙個無符號整型變數?知不知道這樣做會發生什麼?還沒有嘗試的就讓我們來探索下無符號整型隱藏的秘密。先來看看下面 int main 執行的結果 4294967295 請按任意鍵繼續.你可能禁不住驚嘆 這麼大!沒想到吧,把乙個負數賦值給無符號整型變數,會產生這麼大的數!為啥呢?好,...

無符號整型賦值陷阱

有沒有人嘗試過將負數賦給乙個無符號整型變數?知不知道這樣做會發生什麼?還沒有嘗試的就讓我們來探索下無符號整型隱藏的秘密。先來看看下面 int main 執行的結果 4294967295 請按任意鍵繼續.你可能禁不住驚嘆 這麼大!沒想到吧,把乙個負數賦值給無符號整型變數,會產生這麼大的數!為啥呢?好,...

無符號整型賦值陷阱

有沒有人嘗試過將負數賦給乙個無符號整型變數?知不知道這樣做會發生什麼?還沒有嘗試的就讓我們來探索下無符號整型隱藏的秘密。先來看看下面 int main 執行的結果 4294967295 請按任意鍵繼續.你可能禁不住驚嘆 這麼大!沒想到吧,把乙個負數賦值給無符號整型變數,會產生這麼大的數!為啥呢?好,...