12
#include <stdio.h>

int main(){
    unsigned char a[4] = {1, 2, 3, 4};
    int b = *(int *)&a[0];

    printf("%d\n", b);
    return 0;
}

我只是不明白为什么bis的结果0x4030201

有人可以帮我吗?

4

3 回答 3

15

当您告诉编译器创建这样的数组时:

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

于 2012-09-08T09:28:23.547 回答
6

您在一台小端机器上,这意味着大小大于一个字节的整数首先存储最低有效字节。

请注意,由于 x86 的通用性,如今大多数架构都是 little-endian。

于 2012-09-08T09:14:29.453 回答
1

因为你的系统是小端的。多字节整数中的第一个字节被解释为小端系统中的最低有效字节。

于 2012-09-08T09:14:20.007 回答