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

时间:2017-12-04 21:25:30

标签: c++ formatting hex printf string-formatting

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

我的代码:

int16_t i = -4;
printf("i = %04x\n", i);

输出:

i = fffffffc

我想要的是十六进制输出只保留16位而不是切换到32位表示。它对正值有用。

期望的输出:

i = fffc

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

哦,我也认为这可能是一个编译器,我在Visual C ++中第一次体验它,但使用GCC进行测试在Linux下给出了相同的结果。

2 个答案:

答案 0 :(得分:1)

带有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 )强制执行预期结果:

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

C ++样式输出

使用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不执行整数提升,只使用您输出的值的类型。

Online demo

答案 1 :(得分:0)

感谢Pete Becker解释根本原因:int16_t被提升为int,我的系统是32位,因此负数具有32位十六进制表示。通过在i内投放uint16_tprintfint隐藏了符号,并根据需要格式化十六进制。

int16_t i = -4;
printf("i = %04x\n", (uint16_t) i);

输出:

i = fffc