2012-04-24 19:30
2555人閱讀收藏
舉報擴充套件
先出幾個題目,再解釋一下為什麼答案是那樣的。
題目一:
int a = -1;
unsigned int b = 1;
printf("%d", a > b);
結果輸出:1
因為無符號數與有符號數比較時,要將有符號數轉化為無符號數,再來比較。a轉化為無符號數後就是0xffffffff,肯定大於b
題目二:
char a = -1;
unsigned char b = 1;
printf("%d", a > b);
結果輸出:0
奇怪了,怎麼會這樣?這是因為兩者被轉化為int了,a轉化為int就表示-1,b轉化為int 就是1,前者小於後者。注意了這裡不是像題目一裡一樣簡單的把char轉化為unsigned char了
題目三:
int a = -1;
unsigned
char b = -1;
printf("%d\n", a < b);
結果輸出是:1
原因在於要把b轉化為int就是0xff當然大於-1了
題目四:
char a = -1;
unsigned
int b = -1;
printf("%d\n", a == b);
結果輸出:1
原因是char型別被擴充套件為unsigned int後與b相等,同為0xffffffff
下面給出我個人得出的一些結論:
無符號int與有符號int比較大小,轉化為無符號int來比較
int型別與非無符號int的型別比較時,非無符號int的型別轉化為int來比較
無符號int型別與其他型別如unsigned short,signed short,unsigned char, char 比較時,其他型別一律轉化為無符號int型別來比較
非無符號int型別和非int型別如unsigned short,signed short,unsigned char, char 比較時,一律轉化為int型別來比較
無符號數與有符號數比較
1轉化為無符號數 65535 在計算機中負數是用補碼表示的,即反碼加1 正數直接用原碼表示 因為 1是負數就用補碼表示為 00000000 00000001 的反碼 11111111 11111110 1 即 11111111 11111111 轉換為十進位制數為65535 最高位為符號位不必考慮 ...
有符號數與無符號數
關於有符號數和無符號數的一些重要知識點,包括它們在記憶體中的儲存方式 互相轉換 越界計算等。大家肯定都知道,對於有符號數,資料型別的最高位用於標示資料的符號,最高位為1表示負數,最高位為0表示正數,那麼今天我們主要就此討論乙個問題 在計算機內部具體是如何表示有符號數呢?在計算機內部是通過補碼的方式來...
有符號數與無符號數運算
有符號數與無符號數之間運算問題,這個問題測試是否懂得c語言中的整數自動轉換原則,有些開發者懂得極少這些東西。當表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號型別。因此,從這個意義上講,無符號數的運算優先順序要高於有符號數,這一點對於應當頻繁用到無符號資料型別的嵌入式系統來說是丰常...