遇到如下代碼:
#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;
}
輸出結果為:12, FFFFFF80, 40,
期望結果應該是:12, 80, 40,
雖然知道是無符號有符號整型類型提升的問題,但也花了不少時間理順其邏輯。
1. 首先printf的可變參數(shù)期望是int型,因此data[i]會提示至int。
2. data[i]為char型,提升時會帶符號,0x80表示-128,而int型表示為0xFFFFFF80。
3. %02X表示長度小于2用0填充,而不是截斷為長度2。
問題的根源在于data的定義不嚴謹,應該定義為unsigned char。