使用字符串格式限制十六进制数字的数量
Limit the number of hex digits with string formatting
我在 4 个字符的项目中以十六进制显示值,因为该值是 16 位。在这种情况下,值也已签名,这就是我的问题所在。
我的代码:
int16_t i = -4;
printf("i = %04x\n", i);
输出:
i = fffffffc
我希望十六进制输出保持仅 16 位,而不是切换到 32 位表示。它对正值起作用。
期望的输出:
i = fffc
有没有一种很好的方法来指定十六进制数字的总数,或者将输出锁定为与最小值相同? (理想情况下不必求助于将值作为字符串进行操作:))
哦,我还认为这可能是编译器的问题,因为我第一次在 Visual C++ 中体验过它,但在 GCC
下的测试在 Linux 下给出了相同的结果。
感谢 Pete Becker 解释根本原因:int16_t
被提升为 int
,在我的系统上它是 32 位的,因此负数具有 32 位十六进制表示。通过在 printf
中将 i
转换为 uint16_t
,符号从 int
中隐藏,并且十六进制的格式是根据需要的。
int16_t i = -4;
printf("i = %04x\n", (uint16_t) i);
输出:
i = fffc
带printf()
的C风格输出
说明符 "%x"
用于无符号整数。您的 int16_t
在调用中获得整数提升,带符号的数字 -4
以二进制编码为整数 fffffffc
,然后按原样使用。
specifier "%x" is, that the size and precision in the formatting string are minimum numbers of digits. So it's not possible to force the formatting to truncate the output. However, you can force the expected result with a binary-and(运算符&
)的问题:
printf("i = %04x\n", i & 0xffff); // put as much f as digits you want to keep
C++ 风格输出
使用 C++ 流,您还可以使用 <iomanip>
:
格式化为十六进制
cout<<setw(4)<< setfill('0')<<hex<<i<<endl;
ostream 不执行整数提升,只使用您输出的值的类型。
我在 4 个字符的项目中以十六进制显示值,因为该值是 16 位。在这种情况下,值也已签名,这就是我的问题所在。
我的代码:
int16_t i = -4;
printf("i = %04x\n", i);
输出:
i = fffffffc
我希望十六进制输出保持仅 16 位,而不是切换到 32 位表示。它对正值起作用。
期望的输出:
i = fffc
有没有一种很好的方法来指定十六进制数字的总数,或者将输出锁定为与最小值相同? (理想情况下不必求助于将值作为字符串进行操作:))
哦,我还认为这可能是编译器的问题,因为我第一次在 Visual C++ 中体验过它,但在 GCC
下的测试在 Linux 下给出了相同的结果。
感谢 Pete Becker 解释根本原因:int16_t
被提升为 int
,在我的系统上它是 32 位的,因此负数具有 32 位十六进制表示。通过在 printf
中将 i
转换为 uint16_t
,符号从 int
中隐藏,并且十六进制的格式是根据需要的。
int16_t i = -4;
printf("i = %04x\n", (uint16_t) i);
输出:
i = fffc
带printf()
的C风格输出
说明符 "%x"
用于无符号整数。您的 int16_t
在调用中获得整数提升,带符号的数字 -4
以二进制编码为整数 fffffffc
,然后按原样使用。
specifier "%x" is, that the size and precision in the formatting string are minimum numbers of digits. So it's not possible to force the formatting to truncate the output. However, you can force the expected result with a binary-and(运算符&
)的问题:
printf("i = %04x\n", i & 0xffff); // put as much f as digits you want to keep
C++ 风格输出
使用 C++ 流,您还可以使用 <iomanip>
:
cout<<setw(4)<< setfill('0')<<hex<<i<<endl;
ostream 不执行整数提升,只使用您输出的值的类型。