有符號數 、無符號數 淺析

1. 32位int類型

  • 有符號數  

     signed int a ;  //默認情況下聲明的整型變量都是有符號的的

     最高位是符號位, 0爲正,1爲負, 低31位表示數值大小,數據範圍爲:  - 2^31  到  2^31 -1  ,因爲有個0 ,所以要減1

  • 無符號數

     unsigned int  a;

     32位中均表示數值大小,沒有正負之分  , 所以數據範圍爲: 0 到 2^32 -1


#include<stdio.h>
int main()
{
    unsigned int a=6;
    signed int b=-20;  
    
    printf("%d\n",a+b);

    if( (a+b)>6 )
    {
        printf("---------------1\n");
    }
    else
    {
        printf("---------------2\n");
    }

    return 0;


結果是: -14    ------------1


    當表達式中存在有符號類型無符號類型時所有的操作數都自動轉換爲無符號類型。因此,從這個意義上講,
無符號數的運算優先級要高於有符號數,這一點對於應當頻繁用到無符號數據類型的嵌入式系統來說是豐常重要的。

    -14 > 6  編譯器會自動轉化爲無符號數來進行處理,因此a+b = -14 +2^32 = 4294967282 這樣比較下去當然6了

 
再進行一個實驗,分別定義一個signed int型數據和unsigned int型數據,然後進行大小比較:
    unsigned int a=20;
    signed int b=-130;

a>b?還是b>a?實驗證明b>a,也就是說-130>20,爲什麼會出現這樣的結果呢?
這是因爲在C語言操作中,如果遇到無符號數與有符號數之間的操作,編譯器會自動轉化爲無符號數來進行處理,因此a=20,b=-130+2^32 = 4294967166,這樣比較下去當然b>a了。










發佈了17 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章