遇到如下代碼:
#include <stdio.h>
int main() {
const char data[] = {0x12, 0x80, 0x40};
int i;
for (i=0; i<sizeof(data)/sizeof(data[0]); ++i) {
printf("%02X, ", data[i]);
}
return 0;
}
輸出結(jié)果為:12, FFFFFF80, 40,
期望結(jié)果應(yīng)該是:12, 80, 40,
雖然知道是無符號(hào)有符號(hào)整型類型提升的問題,但也花了不少時(shí)間理順其邏輯。
1. 首先printf的可變參數(shù)期望是int型,因此data[i]會(huì)提示至int。
2. data[i]為char型,提升時(shí)會(huì)帶符號(hào),0x80表示-128,而int型表示為0xFFFFFF80。
3. %02X表示長度小于2用0填充,而不是截?cái)酁殚L度2。
問題的根源在于data的定義不嚴(yán)謹(jǐn),應(yīng)該定義為unsigned char。