1

私のコードは次のとおりです:-

#include<stdio.h>

main() {
    union a {
        short int x;
        char y[2];
    };
    union a e;
    e.y[0] = 3;
    e.y[1] = 2;
    printf("%d\n%d\n%d\n", e.y[0], e.y[1], e.x);

    return 0;
}

それは次のように出力を与えます

3
2
515

この515がどうやって来るのか分かりませんでしたか?

4

3 に答える 3

4

アスキーアートの言い訳が欲しかったので...

を宣言unionすると、データの解釈方法を選択できます。あなたの場合、またはunsigned shortとしてchar [2]。これらは両方とも2バイトの長さであるため、ユニオンはメモリの2バイトのセクションを参照します。

union a e;

    ---------------
e-> | ???? | ???? |
    ---------------

ここで、ユニオンを文字配列として解釈することにしました。

e.y[0] = 3;

    ---------------
e-> | 0x03 | ???? |
    ---------------

e.y[1] = 2;

    ---------------
e-> | 0x03 | 0x02 |
    ---------------

unsigned short次に、それを:として解釈します。

printf("%d\n%d\n%d\n", e.y[0], e.y[1], e.x);

(@Oliが指摘したように)リトルエンディアンシステムを使用しています。つまり、最下位バイトが最初にメモリに格納されます。つまり、コードがを見ると、最下位バイトで あるunsigned shortと見なされます。0x03

したがって、2バイトのunsignedshortはとして解釈され0x0203ます。そして、0x020316進数は51510進数です。


そのコメントは、明確にするために答えを入れるのに十分興味深いものだったと思います。

これを行うとしましょう:

union a {
    int x;
    char y[2];
};

int main(int argc, char * argv[])
{
    union a e = {512};
}

中身は?分解してください:

intは4バイト、char [2]は2バイトであるため、union最大のデータ型を格納するための長さは4バイトです。 16進数です5120x00000200したがって、その整数のリトルエンディアンを格納すると、次のようになります。

    -----------------------------
e-> | 0x00 | 0x02 | 0x00 | 0x00 |
    -----------------------------

つまりe.x、512e.y[0]です。は0で、e.y[1]は2です。

于 2012-06-07T18:57:09.953 に答える
3

515は16進数の0x0203です。

ey [0]は3、つまり0x03です。ey [1]は2、つまり0x02です。

短いintxは、2つを0x0203、つまり515に結合します。

于 2012-06-07T18:24:46.903 に答える
1

リトルエンディアンシステムがあります。

2 * 2 8 + 3=515。

shortユニオンを使用すると、が使用するメモリを連続したのペアとして効果的に再解釈できますchar

于 2012-06-07T18:24:17.907 に答える