C言語の基礎
struct { unsigned int x : 3; } s;
int v = 9;
s.x = v;
printf("%d\n", s.x);3ビットのビットフィールドに9を入れる上のコードを実行したときの出力として、正しいものはどれか。
- A1
- B7
- C9
答えと解説を見る
正解:A. 1
x は3ビットの符号なしのビットフィールドなので、0〜7 しか表せません。符号なしの型に入らない値を入れると 2³ = 8 で割った余りになるので、9は1になります。ビットフィールドは、レジスタの設定欄や通信のフラグのような小さな値を詰めて持つのに使えますが、欄のビットの並び順などは処理系によって違います。gcc では、定数の9を直接 s.x に代入すると警告が出ます。
- A. 正しい。9を8で割った余りの1になります。
- B. 最大値の7で止まる(飽和する)と考えた場合の値です。
- C. 3ビットの欄には9は入らず、上位のビットは失われます。