如何遍历数组将其元素解释为不同类型?
How to iterate over array interpreting its element as different type?
有一个 arr
数组分配了两个 short
的内存(总共 4 个字节)。然后我相应地用 ffff
和 eeee
填充这两个元素。在我尝试遍历分配给 4 char
s 的相同分配内存之后(总共也是 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
.
有一个 arr
数组分配了两个 short
的内存(总共 4 个字节)。然后我相应地用 ffff
和 eeee
填充这两个元素。在我尝试遍历分配给 4 char
s 的相同分配内存之后(总共也是 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
.