C言語の基礎
union { uint32_t w; uint8_t b[4]; } u;
u.w = 0x12345678;
printf("%02X %02X\n", u.b[0], u.b[1]);uint32_t は32ビット、uint8_t は8ビットの符号なし整数型で、リトルエンディアンの環境とする。上のコードを実行したときの出力として、正しいものはどれか。
- A12 34
- B78 56
- C87 65
答えと解説を見る
正解:B. 78 56
共用体(union)のメンバは同じ番地から重ねて置かれるので、u.b[0]〜u.b[3] は u.w の4バイトをそれぞれ表します。リトルエンディアンでは最下位のバイトを最も小さい番地に置くので、0x12345678 は小さい番地から 78、56、34、12 の順に並びます。そのため u.b[0] は 0x78、u.b[1] は 0x56 です。書き込んだのとは別のメンバで読むことは、このようにバイトの並びを調べるのに使えますが、結果はエンディアンによって変わります。
- A. ビッグエンディアンの環境での出力です。
- B. 正しい。最下位のバイト 0x78 が先頭の番地に置かれます。
- C. バイトの並びは逆になりますが、1バイトの中の上位と下位の4ビットが入れ替わることはありません。