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