![](/img/trans.png)
[英]not printing out all alphabet just one letter but it needs to print out every letter after the one that was entered
[英]Why does printf not print out just one byte when printing hex?
pixel_data
是char
的vector
。
当我执行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.