负数赋值给无符号数的陷阱【转】
有沒有人嘗試過將負數賦給一個無符號整型變量?知不知道這樣做會發生什么?還沒有嘗試的就讓我們來探索下無符號整型隱藏的秘密。
先來看看下面代碼:
int main()
{
????? unsigned int val = -1;
????? cout<<val<<endl;
????? return 0;
}
執行的結果:
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哈哈~
轉載于:https://www.cnblogs.com/journal-of-xjx/p/6411245.html
總結
以上是生活随笔為你收集整理的负数赋值给无符号数的陷阱【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java笔试之字符串反转
- 下一篇: 垂直居中效果汇总