アスキーアートの言い訳が欲しかったので...
を宣言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
ます。そして、0x0203
16進数は515
10進数です。
そのコメントは、明確にするために答えを入れるのに十分興味深いものだったと思います。
これを行うとしましょう:
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進数です512
。0x00000200
したがって、その整数のリトルエンディアンを格納すると、次のようになります。
-----------------------------
e-> | 0x00 | 0x02 | 0x00 | 0x00 |
-----------------------------
つまりe.x
、512e.y[0]
です。は0で、e.y[1]
は2です。