深入理解signed、unsigned 关键字
深入理解signed、unsigned 關鍵字
答:
1.-0?和+0?在內存里面分別怎么存儲:
計算機里表示數字用的都是補碼不是原碼。想知道補碼是啥可以去百度一下。零在計算機里就是0,不存在正負一說。0和正數的補碼都等于原碼,也就是平時說的2進制數。負數的補碼是符號位置一的情況下,對原碼求反,再加一得到的。經過這樣的變換,負數和正數運算的時候可以直接做加法,不需要根據符號位決定是做加法還是做減法。減法也可以改變有符號數的符號位,然后直接做加法。這樣CPU就不需要專門做減法的電路了。
十進制數??????????原碼????????????反碼?????????補碼
??+0?????????00000000?????00000000???00000000
??-0?????????10000000?????11111111???00000000
2.就以類似的例子來描述:
unsigned int a = 6;
int b = -20;
i+j=?
解釋:
unsigned int類型的數據與int類型的數據相運算后,自動轉化為unsigned int類型。因此a+b的值不是-14,而是一個unsigned int類型的數4294967382.
1).先說下這個數字怎么來的:
在內存中,負數的存儲方式是正數的反碼+1.
6:0x00000006
20:0x00000014,補碼:0xfffffffeb
-20:0xfffffffec
>>> 0xffffffec+0x06
4294967282L
2).%d,%u輸出結果不一樣?
int 與unsigned存儲形式一樣,都是補碼形式,區別在于輸出的格式控制符,當以%d輸出,會認為是有符號數,這樣就把最高位的1當成了符號位,也就是負數(0是正數),當以%u輸出,會認為是無符號數,這樣它會將所有16位的組成都看成是數本身的組成,而沒有符號位一說,所以輸出結果是由16個1組成的二進制數。
這要看你的i+j的輸出格式的,如果是%u 輸出的話 那肯定是沒有負數的。應該是一個很大的正數。但是以%d輸出的話就會轉成int 類型了 ?就會是-14了。
3.unsigned i = 9; for(i=9; i>0; i--) { printf("%u\n", i); } 為什么會出錯。
因為:無符號數永遠沒有負數,恒大于等于0,死循環,。
總結
以上是生活随笔為你收集整理的深入理解signed、unsigned 关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C 语言包含的数据类型如下图所示:
- 下一篇: bool 变量想为什么一般初始化为FAL