- ベストアンサー
構造体の宣言について
今解析しているC言語のプログラムで以下の様な構造体の宣言があります。 typedef struct { unsigned char :3; unsigned char aaa :1; unsigned char bbb :1; unsigned char ccc :1; unsigned char ddd :1; unsigned char eee :1; } tTSR ; :3や:1の部分の意味がわかりません。 御存知の方ご回答よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
★『ビットフィールド』と呼びます。 ・意味は回答者 No.1 さんを参考にして下さい。 ・あと解析しているC言語のプログラムはちょっとだけ問題があります。 問題とは『ビットフィールド』は unsigned int 型のみしか正式にはサポート していません。『unsigned char』型や『unsigned long』型はコンパイラ さんが自動的に『unsigned int』型に変換しているため動くと思われます。 ・よって正しくは『unsigned int』型に記述しなおしましょう。 特に自分でプログラミングをする場合は注意して下さい。 最後に: ・質問内容としては次のようになります。 (1)識別名がない無効なビット(3ビット) (2)識別名が『aaa』のフラグ(1ビット) (3)識別名が『bbb』のフラグ(1ビット) (4)識別名が『ccc』のフラグ(1ビット) (5)識別名が『ddd』のフラグ(1ビット) (6)識別名が『eee』のフラグ(1ビット) ・構造体の意味は何かのフラグ情報(aaa~eee)でしょうね。 識別名がないと単に未使用なビットとして宣言されます。 ・さらに『:0』とすると次の『unsigned int』型にビットを割り当てる事になります。 ・構造体『tTSR』は『3+1+1+1+1+1』=8ビットのフラグ情報を管理している構造体です。 ・以上。おわり。
その他の回答 (3)
- Interest
- ベストアンサー率31% (207/659)
ビットフィールド(bit field)で検索してみてください。 ビットフィールドを使うと、構造体や共用体のメンバに対してビット幅を指定することが出来ます。メモリ割付にはちょっとだけ注意が必要です。<コンパイラによって構造体メンバの埋め方が違うことがあるので > typedef struct { > unsigned char :3; > unsigned char aaa :1; これは、 構造体の先頭から 3bit は使用しない。 4bit目に aaa を充てる。 という意味です。 ビットの指定が悪いとメモリ上に隙間が空いてしまうこともあります。
お礼
御回答頂きありがとうございました
- jacta
- ベストアンサー率26% (845/3158)
ビットフィールドというものです。 http://wisdom.sakura.ne.jp/programming/c/c38.html http://portable-c.jugem.jp/?eid=8
お礼
御回答頂きありがとうございました。
> :3や:1の部分の意味がわかりません。 ビット長を表わします。
お礼
御回答頂きありがとうございました。
お礼
この様な使い方がある事を知りませんでした。 御回答頂きありがとうございました。