【问题标题】:Why does printf() print ffffff before actual data. C [duplicate]为什么 printf() 在实际数据之前打印 ffffff。 C [重复]
【发布时间】:2015-09-21 01:07:11
【问题描述】:

printf() 函数打印前导 ffffff (从技术上讲,我理解最高有效位带有符号,因此它一直被带到数据开始的地方)。但是如何摆脱它们我不知道,为什么会这样?

int mem_display(Cmd *cp, char *arguments)
{
  int i;
  char *adr;
  if (!sscanf(arguments,"%x",&adr))
  {
      return 0;
  }
  printf("%#0.8s ",arguments);

  for (i=0; i<16; i++) {
    printf("%02.x ",(unsigned int)*(adr+i));
  }
...

输出:

 % UNIX> md 10668 
/*calling function show memory location 0x10668*/
    OUT:
     10668 ffffffbc 10 20 ffffffe0 ffffffa0 40 ffffffa2 ffffffa0 44 ffffff9c 23 ffffffa0 20

已解决:

printf("%0.2x ",(unsigned int)*(adr+i));

输出:

UNIX> md 10000
 10000 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 .ELF............

【问题讨论】:

  • 你为什么用.(unsigned int)很可能是错的。
  • 您不应取消引用您刚刚输入的地址,即未定义行为(除非它与您刚刚从同一程序执行中打印的相同值)。指针的格式说明符也错误,类型必须是void *

标签: c printf


【解决方案1】:

强制转换为 unsigned char 以让系统将 *(adr+i) 视为无符号,因此不会进行符号扩展。

for (i=0; i<16; i++) {
    printf("%02.x ",(unsigned char)*(adr+i));
}

【讨论】:

    【解决方案2】:

    请阅读printf() manual,这是正确的方法

    printf("%02x ", (unsigned char) adr[i]);
    

    注意:不要使用这个*(a + i) 表示法,特别是在你投射它的时候。取消引用指针并不是一个坏方法,只是在这种特殊情况下不合适。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 2011-11-21
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      相关资源
      最近更新 更多