轉自: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分)
考點一: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++,滿足條件還會自增一次