将dword强制转换为字节[4]时出现意外结果(endianity swap?)



我正试图将一个dword强制转换为4个字节的数组。当我这样做时,字节似乎会翻转(更改字节序)

据我所知,在little-endian系统上,一个等于0x11223344的dword将如下所示:
0000_1011___0001_0110___0010_0001____0001_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 %xn", b[0], b[1], b[2], b[3]);
}

我得到44 33 22 11
我预计是11 22 33 44

当我使用interpret_cast或时也会发生同样的事情

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

我猜我错了,不是编译器/处理器错了,但我这里缺少什么?同样,在一个big-endian系统中,这会是什么样子?

编辑:所以我想我对little-endian系统的理解是错误的。另一个问题是:在仍然可移植的情况下,哪一个更快:使用移位来获得单个字节值,还是使用memcpy/relpret_cast,然后使用hton()/ntol()?

不,您对little-endian的理解是错误的。小端序意味着最低有效字节位于最低内存地址。

还有:

据我所知,在little-endian系统上,一个等于0x11223344的dword看起来是这样的:

0000 1011 0001 0110 0010 0001 0010 1100

该位模式与0x11223344根本没有任何关系,无论是小端还是大端。在一个小的endian体系结构上,它将读取

0100 0100 0011 0011 0010 0010 0001 0001

然而,在大端系统上,也是如此

0001 0001 0010 0010 0011 0011 0100 0100

最新更新