Say я имею следующую структуру:Порядка данных при литье массива на структуру
typedef struct MyStruct {
unsigned short a; /* 16 bit unsigned integer*/
unsigned short b; /* 16 bit unsigned integer*/
unsigned long c; /* 32 bit unsigned integer*/
}MY_STRUCT;
и некоторые массивы данных (содержание только для демонстрации):
unsigned short data[] = {0x0011, 0x1100, 0x0001, 0x0FFF };
Тогда я выполнить folliwing:
MY_STRUCT *ms;
ms = (MY_STRUCT *) data;
printf("a is: %X\n",(*ms).a);
printf("b is: %X\n",(*ms).b);
printf("c is: %X\n",(*ms).c);
Я хотел бы ожидать данные, которые должны быть считаны последовательно в мс, «слева направо», и в этом случае выходной сигнал будет :
a is: 11
b is: 1100
c is: 10FFF
Однако то, что происходит на самом деле:
a is: 11
b is: 1100
c is: FFF0001
Почему это происходит? Какое поведение следует ожидать при создании массивов таким образом?
Маленькие конечные машины, такие как x86, хранят многобайтовые типы в обратном порядке. –
Примечание: вы нарушаете [строгий псевдоним] (http://cellperformance.beyond3ad.com/articles/2006/06/understanding-strict-aliasing.html) с этим актом. Вам повезло, что компилятор не 32-битный-выровнять ведущих членов. – WhozCraig