-3

dword を 4 バイトの配列にキャストしようとしています。これを行うと、バイトが反転しているように見えます (エンディアンが変更されます)

私が理解しているように、リトル エンディアン システムで 0x11223344 に等しい dword は次のようになります

しかし、私がこれを行うとき:

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

いいえ、あなたのリトルエンディアンの理解は間違っています。リトル エンディアンとは、最下位バイトが最下位メモリ アドレスにあることを意味します。

また:

私が理解しているように、リトルエンディアンシステムで 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 に答える