Неожиданные результаты при сдаче dword в байт [4]

Я пытаюсь использовать dword в массиве из 4 байтов. Когда я делаю это, байты, кажется, переворачиваются (изменяют значение endianness)

Поскольку я понимаю, что dword, равный 0x11223344 для маленьких систем, будет выглядеть так: 0000_1011___0001_0110___0010_0001____0010_1100

но когда я это делаю:

typedef unsigned long dword;
typedef unsigned char byte;
int main(void)
{
 dword a = 0x11223344;
 byte b[4];
 memcpy(b, &a, 4);
 printf("%x %x %x %x\n", b[0], b[1], b[2], b[3]);
}

Я получаю 44 33 22 11. Я ожидал, что это будет 11 22 33 44. То же самое происходит, когда я использую reinterpret_cast или

union
{
dword a;
byte b[4];
} foo;

Я предполагаю, что я ошибаюсь, а не компилятор/процессор, но что мне здесь не хватает? Также как это будет выглядеть в системе большого эндиана?

Edit: Итак, я думаю, что мое понимание маленьких систем endian было неправильным. Другой вопрос: что было бы быстрее, хотя и переноситься: используя сдвиги для получения отдельных байтовых значений или используя memcpy/reinterpret_cast, а затем htonl()/ntohl()?

1 ответ

Нет, ваше понимание little-endian неверно. Маленький endian означает, что младший байт имеет наименьший адрес памяти.

Также:

Поскольку я понимаю, что dword, равный 0x11223344 для маленьких систем, будет выглядеть так:

<code>0000 1011 0001 0110 0010 0001 0010 1100</code>

Эта битовая диаграмма вообще не имеет отношения к 0x11223344, будь то маленький или большой endian. На маленькой эндианской архитектуре он читал бы

0100 0100 0011 0011 0010 0010 0001 0001

Однако в системе с большим эндиантом то же самое было бы

0001 0001 0010 0010 0011 0011 0100 0100

licensed under cc by-sa 3.0 with attribution.