2

構造体と uint64_t で共用体を作成したいので、個々の uint16_ts を構造体で参照し、それらを uint64_t で連結することができます。このテストプログラムを作成しました:

#include "stdio.h"
#include "stdint.h"
struct test_struct{
    uint16_t stuff;
    uint16_t a;
    uint16_t b;
    uint16_t c;
};

union test_union{
    struct test_struct str;
    uint64_t uint;
};    

int main(){
    struct test_struct x = {
        .stuff = 0x0000,
        .a = 0x1234,
        .b = 0x5678,
        .c = 0x9ABC
    };
    union test_union y;
    y.str = x;

    printf("y.uint: %llX\n", y.uint);
}

出力は次のようになります。

y.uint: 9ABC567812340000

これは直感に反します (0000123456789ABC または 123456789ABC のはずです)。構造体の要素が逆になっているように見える理由を誰かに説明してもらえますか?

編集:将来の参考のために:uint16_tsが正しい順序で印刷されたため、エンディアンの回答は私を混乱させました。しかし、これはもちろん、それら自体がリトルエンディアンで格納されているためです。

4

4 に答える 4

7

あなたはリトルエンディアンのプラットフォームを使用しており、最初に格納されたバイト(最下位アドレス)は、結合されたの最下位ビット(印刷時の右側)になりuint64_tます。

ビッグエンディアンプラットフォームで同じコードを実行すると、期待どおりの結果が得られます。現状のコードは、エンディアンが異なるシステム間で移植できません。

于 2013-03-11T13:37:19.213 に答える
0

それはすべてエンディアンと関係があります。C / C ++言語がこれが機能する方法を定義しているとは思いません。定義するのは、実装/ターゲットCPUに任されています。ビッグエンディアンのCPUでは、期待どおりの結果が得られます。

于 2013-03-11T13:37:58.200 に答える
0

プロセッサが「リトルエンディアン」の場合、LSB は最下位のアドレスに格納されるため、これは通常の出力です。Intel の x86 プラットフォームでは、通常、リトルエンディアンです。対照的に、Motorola の PowerPC はビッグ エンディアンです。つまり、最下位アドレスに MSB が格納されます。

于 2013-03-11T13:41:21.410 に答える
0

これはLittle Endianessによるものです。

于 2013-03-11T13:44:05.513 に答える