将char数组转换为整数

Lea*_*ner 11 c arrays int pointers char

#include <stdio.h>

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

    printf("%d\n", b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我只是不明白,为什么结果b0x4030201.

有人可以帮帮我吗?

Tug*_*tes 13

当你告诉编译器创建一个这样的数组时:

unsigned char a[4] = {1, 2, 3, 4};
Run Code Online (Sandbox Code Playgroud)

这些数字按以下顺序放在内存中:

MemoryAddress0: 0x01 -> a[0]
MemoryAddress1: 0x02 -> a[1]
MemoryAddress2: 0x03 -> a[2]
MemoryAddress3: 0x04 -> a[3]
Run Code Online (Sandbox Code Playgroud)

&a[0]是一个char值为的指针,MemoryAddress0并指向1个字节的值0x01

(int*)&a[0]是一个具有相同值MemoryAddress0但具有int*此次类型的转换指针,因此它指向四个连续的字节.

我们日常生活中使用的大多数机器都是小端,这意味着它们在内存中存储多字节值,从最低有效字节到最重要字节.

int*指向四个字节的存储器时,它遇到的第一个字节是最低有效字节,第二个字节是第二个最低有效字节,依此类推.

MemoryAddress0: 0x01 -> 2^0 term
MemoryAddress1: 0x02 -> 2^8 term
MemoryAddress2: 0x03 -> 2^16 term
MemoryAddress3: 0x04 -> 2^24 term
Run Code Online (Sandbox Code Playgroud)

因此,4字节的整数值变为0x01*2^0 + 0x02*2^8 + 0x03*2^16 + 0x04*2^24等于0x04030201.


orl*_*rlp 5

您使用的是小端机器,这意味着大小大于一个字节的整数首先存储最不重要的字节.

请注意,由于x86的共性,目前大多数架构都是小端的.

  • Little-Endian 机器首先存储最不重要的*字节*,而不是位。这是笔误吗? (2认同)

oua*_*uah 1

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