如何遍历数组将其元素解释为不同类型?

How to iterate over array interpreting its element as different type?

有一个 arr 数组分配了两个 short 的内存(总共 4 个字节)。然后我相应地用 ffffeeee 填充这两个元素。在我尝试遍历分配给 4 chars 的相同分配内存之后(总共也是 4 个字节,但现在我想能够按 1 个字节查找元素)。正如您从输出中看到的那样,它没有显示我所期望的(将相同的 0xeeeeffff 拆分为 4 个单独的元素)。代码有什么问题?

  short *arr = malloc(sizeof(short) * 2);
  *arr = 0xeeee;
  *(arr + 1) = 0xffff;
  printf("%p\n", &arr[0]);
  printf("%p\n", &arr[1]);
  // convert
  char * cnv = (char *)arr;
  printf("=======\n");
  for (int i = 0; i < 4; i++) {
    printf("%p\n", cnv);
    printf("%x\n", *cnv);
    cnv++;
  }

输出:

0x759010
0x759012
=======
0x759010
ffffffee # expect 'ee'
0x759011
ffffffee # expect 'ee'
0x759012
ffffffff # expect 'ff'
0x759013
ffffffff # expect 'ff'

char 似乎是您平台上的签名类型。十六进制 0xee 被视为负数 (-18)。当该数字被提升为整数时,它的二进制表示形式是十六​​进制的 0xffffffee

同样的事情发生在 0xff

如果您使用 %d 打印它,您可以在输出中看到负值。

printf("%x %d\n", *cnv, *cnv);

%x 期望 unsigned int,而不是 char,因此您的程序具有未定义的行为。你需要 %hhx.