为什么 printf 在打印十六进制时不只打印一个字节?
pixel_data
是 char
的向量
。
当我执行 printf(" 0x%1x ", Pixel_data[0] )
时,我期望看到 0xf5
。
但我得到 0xfffffff5
,就好像我打印的是 4 字节整数而不是 1 字节。
这是为什么呢?我已经给了 printf
一个 char
来打印 - 它只有 1 个字节,那么为什么 printf
打印 4?
注意。 printf 实现包含在第三方 API 中,但只是想知道这是否是标准 printf 的功能?
pixel_data
is a vector
of char
.
When I do printf(" 0x%1x ", pixel_data[0] )
I'm expecting to see 0xf5
.
But I get 0xfffffff5
as though I was printing out a 4 byte integer instead of 1 byte.
Why is this? I have given printf
a char
to print out - it's only 1 byte, so why is printf
printing 4?
NB. the printf
implementation is wrapped up inside a third party API but just wondering if this is a feature of standard printf
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可能会得到一种良性形式的未定义行为,因为
%x
修饰符需要一个unsigned int
参数,而char
通常会被提升为传递给 varargs 函数时为int
。您应该将 char 显式转换为
unsigned int
以获得可预测的结果:请注意,字段宽度为 1 并不是很有用。它仅指定要显示的最小位数,并且在任何情况下都至少需要一位数字。
如果您平台上的
char
已签名,则此转换会将负char
值转换为大的unsigned int
值(例如fffffff5)。如果您想将字节值视为无符号值,并且在转换为
unsigned int
时仅进行零扩展,则应使用unsigned char
来表示pixel_data
,或强制转换通过unsigned char
或在升级后使用掩码操作。例如
或
You're probably getting a benign form of undefined behaviour because the
%x
modifier expects anunsigned int
parameter and achar
will usually be promoted to anint
when passed to a varargs function.You should explicitly cast the char to an
unsigned int
to get predictable results:Note that a field width of one is not very useful. It merely specifies the minimum number of digits to display and at least one digit will be needed in any case.
If
char
on your platform is signed then this conversion will convert negativechar
values to largeunsigned int
values (e.g.fffffff5
). If you want to treat byte values as unsigned values and just zero extend when converting tounsigned int
you should useunsigned char
forpixel_data
, or cast viaunsigned char
or use a masking operation after promotion.e.g.
or
使用
%hhx
Use
%hhx
最好使用标准格式标志,
然后编译器为您添加十六进制前缀。
Better use the standard-format-flags
then your compiler puts the hex-prefix for you.
那么
length
修饰符就是最小长度。Then
length
modifier is the minimum length.printf 中的宽度说明符实际上是最小宽度。您可以执行
printf(" 0x%2x ", Pixel_data[0] & 0xff)
来打印低字节(注意 2,如果pixel_data[0]
则实际打印两个字符> 例如0xffffff02
)。Width-specifier in
printf
is actually min-width. You can doprintf(" 0x%2x ", pixel_data[0] & 0xff)
to print lowes byte (notice 2, to actually print two characters ifpixel_data[0]
is eg0xffffff02
).如果没有 0x 前缀,十六进制值可能看起来很奇怪,因此我还使用大写 X 来打印 0xEA 而不是 0Xea:
Without 0x prefix, an hex value may look strange, so I use also with capital X to print like 0xEA instead of 0Xea: