在C中以6个字符打印负十六进制

问题描述

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

对于正数,此行有效:

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

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

解决方法

基于@pmg在评论中提供的解决方案:

Fat

说明:

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

要在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",instruction_data[i] & ~(~0U << (digits * 2) << (digits * 2)));

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...