#include <stdio.h>
int main(){
unsigned char a[4] = {1, 2, 3, 4};
int b = *(int *)&a[0];
printf("%d\n", b);
return 0;
}
我无法理解为什么b
的结果是0x4030201
。
有人可以帮助我吗?
答案 0 :(得分:13)
当你告诉编译器创建一个这样的数组时:
unsigned char a[4] = {1, 2, 3, 4};
这些数字按以下顺序放在内存中:
MemoryAddress0: 0x01 -> a[0]
MemoryAddress1: 0x02 -> a[1]
MemoryAddress2: 0x03 -> a[2]
MemoryAddress3: 0x04 -> a[3]
&a[0]
是一个char
指针,其值为MemoryAddress0
,并指向1个字节的值0x01
(int*)&a[0]
是一个具有相同值MemoryAddress0
但是此int*
类型的已转换指针,因此它指向四个连续字节。
我们日常生活中使用的大多数机器都是 little endian ,这意味着它们在内存中存储多字节值,从最低有效字节到最重要字节。
当int*
指向四个字节的存储器时,它遇到的第一个字节是最低有效字节,第二个字节是第二个最不重要的字节,依此类推。
MemoryAddress0: 0x01 -> 2^0 term
MemoryAddress1: 0x02 -> 2^8 term
MemoryAddress2: 0x03 -> 2^16 term
MemoryAddress3: 0x04 -> 2^24 term
因此,4字节整数值变为0x01*2^0 + 0x02*2^8 + 0x03*2^16 + 0x04*2^24
,等于0x04030201
。
答案 1 :(得分:5)
您使用的是小端机器,这意味着大小大于一个字节的整数首先存储最不重要的字节。
请注意,由于x86的共性,目前大多数架构都是小端的。
答案 2 :(得分:1)
因为你的系统是小端的。多字节整数中的第一个字节被解释为小端系统中的最低有效字节。