C判斷char型和unsigned int型比較大小

轉自:http://www.jeepxie.net/article/307272.html

昨天面試的最後一題,當時感覺做對了,後來用VC編譯發現還是有問題-_-||,好吧,看來這就是沒有offer原因 
原題:

#define MaxCount 200

int LmiQueryCSmd(void)
{
    char Num1 = 0;
    unsigned int Num2;
    Num2 = Max;
    while(1)
    {
        if(Num1++ > Num2)        
        {
            printf("%d\n",Num1);
            break;

        }
    }
return 0;
}

問題:下面的程序怎麼運行,爲什麼???(10分)

結果是 
C判斷char型和unsigned int型比較大小,LmiQueryCSmd

考點一:char、unsgined char 、int等這些類型取值範圍 
考點二:數據在計算機中是以補碼的形式存儲 
考點三:不同類型的數值比較,都是要先轉化爲同樣類型的數值,然後再比較。signed型會默認變成unsigned型,小字節會默認變成大字節類型

如:unsigned char和char比較,兩者會默認是unsigned類型。 
char型(1字節)和int型(4字節)的數值比較大小時,char類型(1字節)的數值會默認轉換爲int類型(4字節),兩者再比較。


那麼char與 int的轉化規則是什麼: 
①:char轉換爲int(unsigned int) 型,轉化爲int 的高三個字節都是以char的符號位(最高位)去填充,例如:

char 爲 -127 :1000 0001 
轉化爲int/unsgined int 的 -127:1111 1111 1111 1111 1111 11111 1000 0001

②:unsigned char轉換爲int(unsigned int) 型,轉化爲int 的高三個字節都是以 0 去填充,例如:

unsigned char 爲 129:1000 00001 
轉化爲int/unsgined int 129:0000 0000 0000 0000 0000 0000 1000 0001

不得不說,多麼巧妙的規則


回到題目裏面:

1、unsigned int 的Num2 爲200 則在內存中表示是: 
Num2 :0000 0000 0000 0000 0000 0000 1100 1000 b

2、char類型的Num1 爲0則再內存中表示是: 
0000 0000 b

3、Num1 每次和 Num2 比較完再自增 
①、Num1 先從char型,轉化爲int型再以unsigned int的類型 
0000 0000 0000 0000 0000 0000 0000 0000 b 
②、Num1自增 
0000 0001 b

一直循環128次 
Num1自增 變成 1000 0000 b,比較時候Num2 ,轉化爲unsigned int的類型: 
(unsigned int)Num1 :1111 1111 1111 1111 1111 1111 1000 0000 b 
很明顯大於 Num2!

4、Num1 大於Num2滿足條件, Num1(char)現在是:1000 00001。打印“ -127”(取反加1) ,退出循環。 
注意:Num1++,滿足條件還會自增一次

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章