#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
is的结果0x4030201
。
有人可以帮我吗?
当您告诉编译器创建这样的数组时:
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*
因此它指向四个连续的字节。
我们在日常生活中使用的大多数机器都是小端序,这意味着它们将多字节值存储在内存中,从最低有效字节到最高有效字节。
当 anint*
指向四个字节的内存时,它遇到的第一个字节是最低有效字节,第二个字节是第二个最低有效字节,依此类推。
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
。
您在一台小端机器上,这意味着大小大于一个字节的整数首先存储最低有效字节。
请注意,由于 x86 的通用性,如今大多数架构都是 little-endian。
因为你的系统是小端的。多字节整数中的第一个字节被解释为小端系统中的最低有效字节。