-1

次の構造体があるとします。

typedef struct MyStruct {

    unsigned short a; /* 16 bit unsigned integer*/
    unsigned short b; /* 16 bit unsigned integer*/
    unsigned long  c; /* 32 bit unsigned integer*/

}MY_STRUCT;

いくつかのデータ配列 (デモンストレーションのみの内容):

unsigned short data[] = {0x0011, 0x1100, 0x0001, 0x0FFF }; 

次に、次のことを実行します。

MY_STRUCT *ms; 

ms = (MY_STRUCT *) data;

printf("a is: %X\n",(*ms).a);
printf("b is: %X\n",(*ms).b);
printf("c is: %X\n",(*ms).c);

データは「左から右」にミリ秒単位で順次読み取られると予想されます。この場合、出力は次のようになります。

a is: 11
b is: 1100
c is: 10FFF

ただし、実際に起こることは次のとおりです。

a is: 11
b is: 1100
c is: FFF0001

なぜこれが起こるのですか?この方法で配列を構造体にキャストすると、どのような動作が予想されますか?

4

3 に答える 3

1

これは、このコードを実行しているマシンのバイト順がリトル エンディアンであるためです。これは、バイトを逆順に格納することを意味します。

数値 0x4A3B2C1D は、0x1D 0x2C 0x3B 0x4A として格納されます。

Intel x86 はリトル エンディアン アーキテクチャです。

aあなたのandbが正しい理由は、データを作成するときに a を保存し、次に を再度shortロードするためです。shortsc の場合は少し異なります。2 を格納shortsしますが、それを long としてロードしようとします。shortsそれらが逆になるように長く結合する場合、プロセッサがそれらを保存するため、保存しませんでした。

于 2013-10-07T07:36:42.167 に答える
1

この方法で配列を構造体にキャストすると、どのような動作が予想されますか?

答えは、場合によります。エンディアンネスのすばらしい世界へようこそ: http://en.wikipedia.org/wiki/Endianness

要点は、人間が読むと予想される方法でデータが保存されていると想定していることです。これはビッグエンディアンです。ただし、おそらく x86 マシンを使用していますが、これはリトルエンディアンです。これは、最上位桁が 4 バイトの先頭ではなく末尾にあることを意味します。そのため、後半のショートが前半のショートの前に表示されます。

この方法では、異なるアーキテクチャで異なる結果が得られます。

于 2013-10-07T07:37:49.943 に答える