c语言中的无符号字节,C语言之有符号数和无符号数
我們知道,在C語言中存在無符號數(shù)和有符號數(shù)(一些高級語言如Java里面是沒有無符號數(shù)的),但是對于計算機(jī)而言,其本身并不區(qū)別有符號數(shù)和無符號數(shù),因為在計算機(jī)里面都是0或者1,但是在我們的實際使用中有時候需要使用有符號數(shù)來表示一個整數(shù),因此我們規(guī)定,當(dāng)最高位為1的時,表示為負(fù)數(shù),最高位為0時,表示為正數(shù)。
1:有符號數(shù)和無符號數(shù)在數(shù)值上的區(qū)別。
有符號數(shù)的最高位用來表示符號,所以在最大的數(shù)值上,有符號數(shù)的最大值小于無符號數(shù)。以一個字節(jié)為例:
有符號數(shù)的取值范圍為:-128 — 0 — 127
無符號數(shù)的取值范圍為:0 — 255
2:正數(shù)和負(fù)數(shù)的轉(zhuǎn)換
轉(zhuǎn)換關(guān)系為:負(fù)數(shù)(正數(shù)) = 正數(shù)(負(fù)數(shù))的補(bǔ)碼 + 1;
例如:
5? = 0000 0101
-5 = 1111 1011
實際的計算:
最大值 - 當(dāng)前值 +1;
0xFF -5 +1 = -5(1111 1011)
0xFF -(-5) +1 = 5(0000 0101)
3:正負(fù)數(shù)在計算機(jī)中的存儲
在計算機(jī)中,并不存在所謂正負(fù),具體看下面的代碼
int main(void)
{
int x = -1;
int i = 0;
unsigned int ux = (unsigned)x;
for(i = 0;i<32;i++)
{
ux = ux >> i;
if((ux & 0x01) == 0)
printf("%d = 1\r\n",i);
}
ux = (unsigned) x;
printf("ux = %d \n",ux);
printf("ux = %u \n",ux);
}
運(yùn)行結(jié)果為:
111111111(32個1)
ux = -1
ux = 4294967295
原因是,當(dāng)我們將 -1 通過強(qiáng)制類型轉(zhuǎn)換賦值給ux時,此時ux變量所對應(yīng)的地址,所存放的值是-1,也就是0xFFFFFFFF,也就是說,從存儲的角度上講,-1和4294967295在計算機(jī)的存儲值都是0xFFFFFFFF,關(guān)鍵是你按怎樣的方式去解析,
ux = -1;此時我們是按%d也就是有符號×××的方式去解析這個存儲空間所對應(yīng)的值,所以得到的解析結(jié)果是-1;
ux = 4294967295,此時我們是按%u也就是無符號×××的方式去解析這個存儲空間的值,所以得到的最高位就是數(shù)值位,而不是符號位。
解析過程如下,這里假設(shè)int類型為一個字節(jié)(4個字節(jié)也是一樣的原理,只是數(shù)值更大而已)權(quán)255-1
位值位值
11111
21212
41414
81818
16116116
32132132
64164164
12811281-128
所以
-1 = 1+2+4+8+16+32+64+(-128)
255 = 1+2+4+8+16+32+64+128
綜上所述,計算機(jī)中的存儲方式并不區(qū)分正負(fù),關(guān)鍵在于程序員用什么方式去解析這塊存儲空間(地址)的值。
總結(jié)
以上是生活随笔為你收集整理的c语言中的无符号字节,C语言之有符号数和无符号数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Html5里frameSet不在使用的替
- 下一篇: 通过修改然后commit的方式创建自己的