【问题标题】:Print negative hex with 6 char in C在C中打印带有6个字符的负十六进制
【发布时间】:2020-12-02 05:14:02
【问题描述】:

我尝试用十六进制打印一个负数,我希望它是 6 个字符。
例如,十六进制的-132ffffff7c,想要的输出应该是ffff7c

对于正数,这条线工作:

fprintf(fd,"%07d \t%06x \n",i+100,instruction_data[i]);

对于负数,我再得到两个f

【问题讨论】:

  • 我假设instruction_data[i]uint32_t%06x 只会在 MSB 为 0x00 时按预期工作。因为不是(它是0xFF),所以您需要用0xFFFFFF 屏蔽instruction_data[i]
  • 请注意,%x 需要 unsigned int...
  • @pmg 为什么不在网站上发布呢?我根据您下面的代码发布了一个社区 wiki。随意编辑或扩展它。
  • 感谢您从我的评论@Lundin 中回答。我仅限于移动设备,为了简洁起见,通常会使用 cmets。

标签: c hex printf stdio


【解决方案1】:

基于cmets中@pmg提供的解决方案:

#include <stdio.h>

void print_hex (int val, size_t digits)
{
  char tmp[100]; 
  size_t length = sprintf(tmp, "%X", (unsigned int)val);
  if(digits > length)
  {
    digits = length;
  }
  
  printf("%.*s\n", digits, tmp+length-digits);
}

int main (void)
{
  print_hex(-132,6);   // FFFF7C
  print_hex(-132,3);   // F7C
  print_hex(-132,666); // FFFFFF7C
  print_hex(132,2);    // 84
}

解释:

  • sprintf 调用将传递的数字转换为 ASCII 十六进制并将其存储在临时缓冲区中。
  • unsigned int 的强制转换对于 %X 说明符是必需的。
  • sprintf 返回写入的字符数。
  • if(digits &gt; length) { digits = length; } 是一些简单的错误处理,以确保函数不会尝试打印比现有数字更多的数字。
  • printf 中的 %.*s 技巧允许第一个参数可变地指定要写入的字符数。
  • tmp+length-digits 是指针算法,确保从字符串末尾而不是从开头打印 digits 的字符数,如果我们只写 tmp 就会得到。

【讨论】:

  • printf("%.*s\n", digits, tmp+length-digits); 可以简化为printf("%s\n", tmp+length-digits);。此外,OP 似乎总是需要 6 位数字,因此您应该将 sprintf(tmp, "%X", (unsigned int)val); 更改为 sprintf(tmp, "%.8X", (unsigned int)val);
【解决方案2】:

要在 32 位架构上只打印 6 个十六进制数字的负数,您可以简单地用 0xffffff 标记该值:

    fprintf(fd, "%07d \t%.6x \n", i + 100, instruction_data[i] & 0xffffffU);

将位数指定为int 变量:

    int digits = 6;
    ...
    fprintf(fd, "%07d \t%.*x \n", i + 100, digits,
            instruction_data[i] & ~(~0U << (digits * 2) << (digits * 2)));

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 1970-01-01
    • 2012-03-25
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2015-12-16
    • 2019-01-29
    相关资源
    最近更新 更多