天天看點

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

我們知道,在C語言中存在無符号數和有符号數(一些進階語言如Java裡面是沒有無符号數的),但是對于計算機而言,其本身并不差別有符号數和無符号數,因為在計算機裡面都是0或者1,但是在我們的實際使用中有時候需要使用有符号數來表示一個整數,是以我們規定,當最高位為1的時,表示為負數,最高位為0時,表示為正數。

1:有符号數和無符号數在數值上的差別。

有符号數的最高位用來表示符号,是以在最大的數值上,有符号數的最大值小于無符号數。以一個位元組為例:

有符号數的取值範圍為:-128 — 0 — 127

無符号數的取值範圍為:0 — 255

2:正數和負數的轉換

轉換關系為:負數(正數) = 正數(負數)的補碼 + 1;

例如:

5  = 0000 0101

-5 = 1111 1011

實際的計算:

最大值 - 目前值 +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

2

4

8

16

32

64

128

-128

是以

-1 = 1+2+4+8+16+32+64+(-128)

255 = 1+2+4+8+16+32+64+128

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

本文轉自 菜鳥養成記 51CTO部落格,原文連結:http://blog.51cto.com/11674570/1956201