为什么printf在打印hex时只打印出一个字节?

时间:2010-08-24 11:09:54

标签: c++ c printf

pixel_datavector char

当我printf(" 0x%1x ", pixel_data[0] )时,我希望看到0xf5

但我得到0xfffffff5好像我打印出一个4字节整数而不是1字节。

这是为什么?我已经printf一个char打印出来 - 它只有1个字节,为什么printf打印4?

NB。 printf实现包含在第三方API中,但只是想知道这是否是标准printf的功能?

5 个答案:

答案 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,则实际打印两个字符。)