使用字符串格式限制十六进制数字的数量

Limit the number of hex digits with string formatting

本文关键字:十六进制数字 字符串 格式      更新时间:2023-10-16

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

我的代码:

int16_t i = -4;
printf("i = %04xn", i);

输出:

i = fffffffc

我想要的是仅保留16位而不切换到32位表示形式的十六进制。它适用于正值。

所需的输出:

i = fffc

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

哦,我也认为这可能是编译器的内容,因为我在Visual C 中经历了它,但是使用GCC进行测试在Linux下给出了相同的结果。

printf()

的C样式输出

指定符"%x"适用于无符号整数。您的int16_t在呼叫中获得整数促销,并且符号编号-4在二进制中编码为整数fffffffc,然后将其作为此类进行。

指定符"%x"的问题是,格式字符串中的大小和精度是数字的最小数量。因此,不可能强制格式截断输出。但是,您可以用二进制和(操作员&)强制预期结果:

printf("i = %04xn", i & 0xffff);  // put as much f as digits you want to keep

C 样式输出

使用C 流,您也可以使用<iomanip>格式为十六进制:

cout<<setw(4)<< setfill('0')<<hex<<i<<endl;

Ostreams不执行整数促销,而只使用输出的值类型。

在线演示

感谢皮特·贝克尔(Pete Becker)解释了根本原因:int16_t被提升为int,在我的系统上是32位,因此负数为32位十六进制表示。通过将i施放到printf中CC_13中,符号从int隐藏,并且可以根据需要进行格式。

int16_t i = -4;
printf("i = %04xn", (uint16_t) i);

输出:

i = fffc