#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
.
Может ли кто-нибудь помочь мне?
#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
.
Может ли кто-нибудь помочь мне?
Когда вы сообщаете компилятору создать такой массив:
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
.
Вы находитесь на машине маленького конца, это означает, что целые числа с размерами, превышающими байты, сначала хранят наименее значимые байты.
Обратите внимание, что большинство архитектур в наши дни малоконцентрированы благодаря общей x86.
Потому что ваша система немного ориентирована. Первый байт в многобайтовом целочисленном значении интерпретируется как наименее значащий байт в малочисленных системах.