C言語の基礎

struct { unsigned int x : 3; } s;
int v = 9;
s.x = v;
printf("%d\n", s.x);

3ビットのビットフィールドに9を入れる上のコードを実行したときの出力として、正しいものはどれか。

  1. A1
  2. B7
  3. C9
答えと解説を見る

正解:A. 1

x は3ビットの符号なしのビットフィールドなので、0〜7 しか表せません。符号なしの型に入らない値を入れると 2³ = 8 で割った余りになるので、9は1になります。ビットフィールドは、レジスタの設定欄や通信のフラグのような小さな値を詰めて持つのに使えますが、欄のビットの並び順などは処理系によって違います。gcc では、定数の9を直接 s.x に代入すると警告が出ます。

  • A. 正しい。9を8で割った余りの1になります。
  • B. 最大値の7で止まる(飽和する)と考えた場合の値です。
  • C. 3ビットの欄には9は入らず、上位のビットは失われます。
この分野を解く 分野ページへ

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

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

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

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