-3

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

据我了解,在小端系统上等于 0x11223344 的 dword 将如下所示:
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;

我猜我错了,而不是编译器/处理器,但是我在这里缺少什么?另外,这在大端系统上看起来如何?

编辑:所以我想我对小端系统的理解是错误的。另一个问题:哪个会更快,同时仍然是可移植的:使用移位来获取单个字节值或使用 memcpy/reinterpret_cast 然后使用 htonl()/ntohl()?

4

1 回答 1

4

不,您对 little-endian 的理解是不正确的。Little endian 意味着最低有效字节位于最低内存地址。

还:

据我了解,在小端系统上等于 0x11223344 的 dword 将如下所示:

0000 1011 0001 0110 0010 0001 0010 1100

那个位模式根本没有任何关系0x11223344,无论是小端还是大端。在小端架构上,它会读取

0100 0100 0011 0011 0010 0010 0001 0001

然而,在大端系统上,同样的情况是

0001 0001 0010 0010 0011 0011 0100 0100
于 2013-08-23T21:22:30.920 回答