我正试图将一个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系统上,一个等于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