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ビットの符号なし整数型で、リトルエンディアンの環境とする。上のコードを実行したときの出力として、正しいものはどれか。

  1. A12 34
  2. B78 56
  3. 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ビットが入れ替わることはありません。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. 3ビットのビットフィールドに9を入れる上のコードを実行したときの出力として、正しいものはどれか。
  2. #define で定義したマクロ SQUARE を使う上のコードを実行したときの出力として、正しいものはどれか。
  3. ヘッダファイル sensor.h を上のように書いた。#ifndef、#define、#endif の3行の目的として、正しいものはどれか。
  4. 上のコードを main 関数の中に書いて実行したときの出力として、正しいものはどれか。
  5. マイコンの出力レジスタを、上のように宣言して使っている。この宣言についての説明として、正しいものはどれか。