2013-08-24 27 views
0

嗨,大家好,我寫了下面的代碼:奇怪領先「F」時,打印出一個字符

union endian { 
    char a; 
    int b; 
} test; 
char c; 

test.b = 0xaabbccdd; 
c = (char)test.a; 
printf("0x%x\n", c); 
printf("0x%x\n", test.b); 
printf("0x%x\n", test.a); 
printf("0x%x\n", (char)test.a); 

但輸出是:

0xffffffdd 
0xaabbccdd 
0xffffffdd 
0xffffffdd 

我想知道爲什麼有一些領先char變量前的0xffffff

+0

它是一個有符號的字符,嘗試改爲'unsigned char'。 –

回答

3

%x將其論點解釋爲unsigned int。傳入可變參數函數的整數總是被提升爲int,因此您使用符號擴展將您簽署的char值提升爲有符號的int,然後通過%x將其解釋爲unsigned int

您可以通過將其轉換爲unsigned charuint8_t來解決此問題。

+0

這些值未被提升。當你傳遞一個不夠大的變量時,c運行時正在查看變量之外的字節。 – dcaswell

+1

@ user814064:他們實際上正在升級(上轉換)。例如,請參閱http://en.cppreference.com/w/cpp/utility/variadic(是的,這是一個C++參考,但暫時不能鏈接您C99標準)。 – nneonneo

+0

@ user814064,這是一個傳遞事物作爲可變參數的規則。 – chris

0

意想不到的FFFFFFFF來自char通過符號擴展轉換爲int。一個可變參數,那些在printf的格式參數(常量字符*格式,...),被轉換後int(如果一個較小的整數類型的)或double(如果浮子)。

推薦:

而不是與未修飾的格式說明%x,(意味着int)打印的ctest.a數值使用修飾符hh

printf("0x%hhx\n", c); 

這將在0x後打印出2個十六進制數字。


價C11 7.21.6.1 7「HH用於指定後續的d,I,O,U,X,或X轉換說明適用於根據一個簽名char或unsigned char參數(該參數將被提升到整數升級,但打印前它的值應轉換爲帶符號的char或unsigned char);「