C語言之有符號數和無符號數

咱們知道,在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

綜上所述,計算機中的存儲方式並不區分正負,關鍵在於程序員用什麼方式去解析這塊存儲空間(地址)的值。

相關文章
相關標籤/搜索