繁体   English   中英

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

[英]Why does printf not print out just one byte when printing hex?

pixel_datacharvector

当我执行printf(" 0x%1x ", pixel_data[0] )我期待看到0xf5

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

为什么是这样? 我给了printf一个要打印的char ——它只有 1 个字节,那么为什么printf打印 4?

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

您可能会遇到未定义行为的良性形式,因为%x修饰符需要一个unsigned int参数,而当传递给varargs函数时, char通常会被提升为int

您应该将 char 显式转换为unsigned int以获得可预测的结果:

printf(" 0x%1x ", (unsigned)pixel_data[0] );

请注意,字段宽度为 1 不是很有用。 它仅指定要显示的最少位数,并且在任何情况下都至少需要一位。

如果您平台上的char是有符号的,那么此转换会将负char值转换为大的unsigned int值(例如fffffff5 )。 如果要将字节值视为无符号值,并且在转换为unsigned int时仅将零扩展为unsigned int ,则应将unsigned char用于pixel_data ,或通过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);

那么length修饰符是最小长度。

printf宽度说明符实际上是最小宽度。 您可以执行printf(" 0x%2x ", pixel_data[0] & 0xff)来打印低字节(注意 2,如果pixel_data[0]是例如0xffffff02 ,则实际打印两个字符)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM