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