将char数组转换为整数

时间:2012-09-08 09:12:35

标签: c arrays pointers char int

#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

有人可以帮助我吗?

3 个答案:

答案 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)

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