提问者:小点点

打印十六进制时,为什么printf不打印出一个字节?


pixel_datachar向量

当我执行printf(“0x%1x”,pixel_data[0])时,我希望看到0xF5

但我得到0xFFFFFFFF5,就像打印出一个4字节的整数而不是1字节一样。

这是为什么? 我给了printf一个char打印输出--它只有1个字节,那么为什么printf打印4?

注意:printf实现被包装在第三方API中,但是想知道这是否是标准printf的特性?


共3个答案

匿名用户

您可能会得到一种良性的未定义行为,因为%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);