我在 4 个字符的项目中以十六进制显示值,因为该值是 16 位。在这种情况下,值也被签名,这就是我的问题所在。
我的代码:
int16_t i = -4;
printf("i = %04x\n", i);
输出:
i = fffffffc
我希望十六进制输出仅保留 16 位,而不是切换到 32 位表示形式。对于正值来说它是这样做的。
期望的输出:
i = fffc
是否有一种好的方法来指定十六进制数字的总数,或将输出锁定为与最小值相同? (理想情况下不必将值作为字符串进行操作:))
哦,我还认为这可能是编译器的问题,因为我第一次在 Visual C++ 中经历过它,但使用 GCC
进行测试在 Linux 下给出了相同的结果。
最佳答案
C 风格输出 printf()
说明符"%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 不执行整数提升,仅使用您输出的值的类型。
关于c++ - 使用字符串格式限制十六进制数字的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47642218/