我在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/