我寫了一個小程序在下面。爲什麼char a = -1與unsigned char b = -1不同,在C編程中
#include <stdio.h>
main(){
char a=-1;
unsigned char b=-1;
printf("%d %d\n",a,b);
printf("%x %x\n",a,b);
if(a==b) printf("equal\n");
else printf("not equal\n");
}
的PROG的輸出是:
-1 255
ffffffff ff
not equal
因爲焦炭是隻有一個字節和-1是在2的補碼形式表示的,我認爲,0xff的將被存儲在兩者& B和因此兩者應該是平等的。任何人都可以讓我知道爲什麼他們不同,爲什麼十六進制的rep'n是0xffffffff &不是0xff。我有一個相關的鏈接http://embeddedgurus.com/stack-overflow/2009/08/a-tutorial-on-signed-and-unsigned-integers/,但我無法得到答案。任何幫助將不勝感激。謝謝。
你告訴char類型在符號比較中被擴展爲int類型。我有兩個疑問:1)這樣的符號類型擴展到int類型是否總是在任何表達式中發生? 2)類似的擴展會發生int類型的short int嗎?我從來不知道C這樣的事情,你能否指出一些相同的鏈接。 – mezda
在C中,所有操作*概念上*都出現在int中(或者更大,可能是無符號類型)。但是,在大多數操作中,操作可以減少到較小的機器操作。具體地說,無論操作是在8位還是在32位中執行,如果只使用低8位,那麼添加兩個char:會得到相同的結果。 2)是的,這發生在所有較小的整數類型上。 C中常見的「gotcha」是檢查一個無符號字符是否使用'〜ch == 0'設置了所有的位。這總是錯誤的,因爲'ch'將被零擴展爲'int'。 – Lindydancer
這看起來不正確。根據類型提升的規則,'unsigned char'被提升爲'unsigned int',只有'signed char'被提升爲'int'(見ISO C標準)。根據隱式類型轉換規則,將'int'與'unsigned int'進行比較會導致兩個值都被轉換爲'unsigned int'。所以正確的答案應該是:它將兩個值擴展到'unsigned int',而不是'int'。 – Mecki