咱們知道,在C語言中存在無符號數和有符號數(一些高級語言如Java裏面是沒有無符號數的),可是對於計算機而言,其自己並不區別有符號數和無符號數,由於在計算機裏面都是0或者1,可是在咱們的實際使用中有時候須要使用有符號數來表示一個整數,所以咱們規定,當最高位爲1的時,表示爲負數,最高位爲0時,表示爲正數。程序員
1:有符號數和無符號數在數值上的區別。ide
有符號數的最高位用來表示符號,因此在最大的數值上,有符號數的最大值小於無符號數。以一個字節爲例:spa
有符號數的取值範圍爲:-128 — 0 — 127it
無符號數的取值範圍爲:0 — 255table
2:正數和負數的轉換class
轉換關係爲:負數(正數) = 正數(負數)的補碼 + 1;變量
例如:原理
5 = 0000 0101程序
-5 = 1111 1011top
實際的計算:
最大值 - 當前值 +1;
0xFF -5 +1 = -5(1111 1011)
0xFF -(-5) +1 = 5(0000 0101)
3:正負數在計算機中的存儲
在計算機中,並不存在所謂正負,具體看下面的代碼
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);
}
運行結果爲:
111111111(32個1)
ux = -1
ux = 4294967295
緣由是,當咱們將 -1 經過強制類型轉換賦值給ux時,此時ux變量所對應的地址,所存放的值是-1,也就是0xFFFFFFFF,也就是說,從存儲的角度上講,-1和4294967295在計算機的存儲值都是0xFFFFFFFF,關鍵是你按怎樣的方式去解析,
ux = -1;此時咱們是按%d也就是有符號×××的方式去解析這個存儲空間所對應的值,因此獲得的解析結果是-1;
ux = 4294967295,此時咱們是按%u也就是無符號×××的方式去解析這個存儲空間的值,因此獲得的最高位就是數值位,而不是符號位。
解析過程以下,這裏假設int類型爲一個字節(4個字節也是同樣的原理,只是數值更大而已)
權 | 255 |
-1 |
||
位 |
值 |
位 |
值 |
|
1 |
1 |
1 |
1 |
1 |
2 |
1 |
2 |
1 |
2 |
4 |
1 |
4 |
1 |
4 |
8 |
1 |
8 |
1 |
8 |
16 |
1 |
16 |
1 |
16 |
32 |
1 |
32 |
1 |
32 |
64 |
1 |
64 |
1 |
64 |
128 |
1 |
128 |
1 |
-128 |
因此
-1 = 1+2+4+8+16+32+64+(-128)
255 = 1+2+4+8+16+32+64+128
綜上所述,計算機中的存儲方式並不區分正負,關鍵在於程序員用什麼方式去解析這塊存儲空間(地址)的值。