我在4个字符的项目中以十六进制显示值,因为值为16位。在这种情况下,值也会被签名,这就是我的问题所在。
我的代码:
int16_t i = -4;
printf("i = %04x\n", i);
输出:
i = fffffffc
我想要的是十六进制输出只保留16位而不是切换到32位表示。它对正值有用。
期望的输出:
i = fffc
是否有一种很好的方法来指定十六进制数字的总数,或者将输出锁定为最小值? (理想情况下,不必诉诸于将值作为字符串操纵:))
哦,我也认为这可能是一个编译器,我在Visual C ++中第一次体验它,但使用GCC
进行测试在Linux下给出了相同的结果。
答案 0 :(得分:1)
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
)强制执行预期结果:
cout<<setw(4)<< setfill('0')<<hex<<i<<endl;
使用c ++流,您还可以使用<iomanip>
格式化为十六进制:
handler: (request, reply) => {
SSEvents.addEventListener('score', function(e) {
const data = JSON.parse(e.data);
return reply.view('students', {
result: data
});
}, false);
},
description: "Endpoint lists all users that have received at least one test score.",
tags: ['api']
}
ostreams不执行整数提升,只使用您输出的值的类型。
答案 1 :(得分:0)
感谢Pete Becker解释根本原因:int16_t
被提升为int
,我的系统是32位,因此负数具有32位十六进制表示。通过在i
内投放uint16_t
到printf
,int
隐藏了符号,并根据需要格式化十六进制。
int16_t i = -4;
printf("i = %04x\n", (uint16_t) i);
输出:
i = fffc