遇到如下代码:
#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的可变参数期望是int型,因此data[i]会提示至int。
2. data[i]为char型,提升时会带符号,0x80表示-128,而int型表示为0xFFFFFF80。
3. %02X表示长度小于2用0填充,而不是截断为长度2。
问题的根源在于data的定义不严谨,应该定义为unsigned char。