为什么 printf() 在实际数据之前打印 ffffff。 C

Why does printf() print ffffff before actual data. C

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............

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

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

注意:不要使用这个*(a + i)符号,特别是在你转换它的时候。取消引用指针的方法不错,只是在这种特定情况下不合适。

转换为 unsigned char 让系统将 *(adr+i) 视为无符号,这样就不会进行符号扩展。

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