pixel_data
是char
的向量
。
当我执行printf(“0x%1x”,pixel_data[0])
时,我希望看到0xF5
。
但我得到0xFFFFFFFF5
,就像打印出一个4字节的整数而不是1字节一样。
这是为什么? 我给了printf
一个char
打印输出--它只有1个字节,那么为什么printf
打印4?
注意:printf
实现被包装在第三方API中,但是想知道这是否是标准printf
的特性?
您可能会得到一种良性的未定义行为,因为%x
修饰符需要一个无符号int
参数,而char
在传递给varargs函数时通常会升级为int
。
您应该显式地将字符强制转换为无符号int
,以获得可预测的结果:
printf(" 0x%1x ", (unsigned)pixel_data[0] );
注意,字段宽度为1并不是很有用。 它只指定要显示的最小数字数,并且在任何情况下都至少需要一个数字。
如果平台上的char
是有符号的,则此转换将把负的char
值转换为大的无符号int
值(例如FFFFFFF5
)。 如果您希望将字节值视为无符号值,并且在转换为unsigned int
时仅扩展零,则应该对pixel_data
使用unsigned char
,或者通过unsigned char
强制转换,或者在提升后使用掩蔽操作。
例如。
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] );
或
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
最好使用标准格式标志
printf(" %#1x ", pixel_data[0] );
然后编译器会为您输入十六进制前缀。
使用%hhx
printf("%#04hhx ", foo);