【问题标题】:Limit the number of hex digits with string formatting使用字符串格式限制十六进制数字的数量
【发布时间】:2017-12-04 21:25:29
【问题描述】:

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

我的代码:

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

输出:

i = fffffffc

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

期望的输出:

i = fffc

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

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

【问题讨论】:

  • 这里的原因是i 被提升为int 以调用printf,并且显然int 在您的系统上是32 位宽。
  • 感谢@PeteBecker 用那个宝石我想出了一个“修复”并将其添加为答案。

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


【解决方案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

C++ 风格输出

使用 c++ 流,您还可以使用 <iomanip> 格式化为十六进制:

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

ostreams 不执行整数提升,只使用您输出的值的类型。

Online demo

【讨论】:

    【解决方案2】:

    感谢 Pete Becker 解释根本原因:int16_t 正在升级为 int,在我的系统上它是 32 位的,因此负数具有 32 位十六进制表示。通过在printf 中将i 转换为uint16_t,符号对int 是隐藏的,并且十六进制的格式是根据需要的。

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

    输出:

    i = fffc
    

    【讨论】:

      猜你喜欢
      • 2021-02-09
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 2014-09-28
      • 2013-06-02
      相关资源
      最近更新 更多