如何解决在C中以6个字符打印负十六进制
我尝试用十六进制打印一个负数,我希望它以6个字符为单位。
例如,十六进制的-132
是ffffff7c
,所需的输出应该是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)));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。