• ベストアンサー

構造体の宣言について

今解析している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の部分の意味がわかりません。 御存知の方ご回答よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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ビットのフラグ情報を管理している構造体です。 ・以上。おわり。

参考URL:
http://www.doumo.jp/postgretips/tips.jsp?tips=28
HERLOCK777
質問者

お礼

この様な使い方がある事を知りませんでした。 御回答頂きありがとうございました。

その他の回答 (3)

  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

ビットフィールド(bit field)で検索してみてください。 ビットフィールドを使うと、構造体や共用体のメンバに対してビット幅を指定することが出来ます。メモリ割付にはちょっとだけ注意が必要です。<コンパイラによって構造体メンバの埋め方が違うことがあるので > typedef struct { > unsigned char :3; > unsigned char aaa :1; これは、 構造体の先頭から 3bit は使用しない。 4bit目に aaa を充てる。 という意味です。 ビットの指定が悪いとメモリ上に隙間が空いてしまうこともあります。

HERLOCK777
質問者

お礼

御回答頂きありがとうございました

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2
HERLOCK777
質問者

お礼

御回答頂きありがとうございました。

noname#26650
noname#26650
回答No.1

> :3や:1の部分の意味がわかりません。 ビット長を表わします。

HERLOCK777
質問者

お礼

御回答頂きありがとうございました。

関連するQ&A