Cast 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;
}

Я просто не могу понять, почему результат b равен 0x4030201.

Может ли кто-нибудь помочь мне?

Ответ 1

Когда вы сообщаете компилятору создать такой массив:

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*, поэтому он указывает на четыре последовательных байта.

Большинство машин, которые мы используем в повседневной жизни, малочисленны, что означает, что они хранят многобайтовые значения в памяти от младшего значащего байта до наиболее значимого.

Когда 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.

Ответ 2

Вы находитесь на машине маленького конца, это означает, что целые числа с размерами, превышающими байты, сначала хранят наименее значимые байты.

Обратите внимание, что большинство архитектур в наши дни малоконцентрированы благодаря общей x86.

Ответ 3

Потому что ваша система немного ориентирована. Первый байт в многобайтовом целочисленном значении интерпретируется как наименее значащий байт в малочисленных системах.