我在4个字符的项目中以十六进制显示值,因为该值为16位。在这种情况下,值也被签名,这就是我的问题所在。

我的代码:

int16_t i = -4;
printf("i = %04x\n", i);


输出:

i = fffffffc


我想要的是十六进制输出仅保留16位,而不切换到32位表示形式。它为正值做什么。

所需的输出:

i = fffc


有没有一种很好的方法来指定十六进制数字的总数,或者将输出锁定为与最小值相同? (理想情况下,不必求助于将值作为字符串操作:))

哦,我也认为这可能是编译器,因为我在Visual C ++中第一次遇到它,但是使用GCC进行测试在Linux下给出了相同的结果。

最佳答案

printf()的C样式输出

说明符"%x"用于无符号整数。您的int16_t在呼叫中得到整数提升,并且带符号的数字-4以二进制编码为整数fffffffc,然后将其取整。

specifier "%x"的问题在于,格式字符串中的大小和精度是最小位数。因此,不可能强制格式截断输出。但是,您可以使用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不执行整数提升,而仅使用您输出的值的类型。

Online demo

关于c++ - 使用字符串格式限制十六进制数字的数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47642218/

10-11 22:23
查看更多