pixel_data
是vector
char
。
当我printf(" 0x%1x ", pixel_data[0] )
时,我希望看到0xf5
。
但我得到0xfffffff5
好像我打印出一个4字节整数而不是1字节。
这是为什么?我已经printf
一个char
打印出来 - 它只有1个字节,为什么printf
打印4?
NB。 printf
实现包含在第三方API中,但只是想知道这是否是标准printf
的功能?
答案 0 :(得分:52)
您可能会获得良性形式的未定义行为,因为%x
修饰符需要unsigned int
参数,char
通常会在传递时升级为int
到 varargs 功能。
您应该将char显式转换为unsigned int
以获得可预测的结果:
printf(" 0x%1x ", (unsigned)pixel_data[0] );
请注意,一个字段宽度不是很有用。它仅指定要显示的最小位数,并且在任何情况下都至少需要一位数。
如果您平台上的char
已签名,则此转化会将否定的char
值转换为较大的unsigned int
值(例如fffffff5
)。如果您希望将字节值视为无符号值,并且在转换为unsigned int
时仅将零延伸,则应使用unsigned char
表示pixel_data
,或通过unsigned char
投射或使用屏蔽操作晋升后。
e.g。
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] );
或
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
答案 1 :(得分:7)
更好地使用标准格式标志
printf(" %#1x ", pixel_data[0] );
然后你的编译器会为你输入十六进制前缀。
答案 2 :(得分:4)
使用%hhx
printf("%#04hhx ", foo);
答案 3 :(得分:3)
然后length
修饰符是最小长度。
答案 4 :(得分:2)
printf
中的宽度指定符实际上是最小宽度。您可以printf(" 0x%2x ", pixel_data[0] & 0xff)
打印低位字节(注意2,如果pixel_data[0]
是0xffffff02
,则实际打印两个字符。)