C言語の規格上、ビットフィールドに使える型は、int, signed int, unsigned intのどれかです。また、ビットフィールドの場合はintは符号付か符合無しになるかはコンパイラ依存なので、明示的にsignedもしくはunsignedをつけてください。
違反コード
typedef struct {
unsigned long member_a: 2; // 型がlong.
int member_b: 2; // 符号(signed or unsigned)の指定がない.
} hoge_t;
適合コード
typedef struct {
unsigned int member_a: 2;
signed int member_b: 2; // 符号ありだと明示的に指定.
} hoge_t;
スポンサーリンク
1bit幅のビットフィールドの型はunsigned intを使う(signed intは不可)
signed int型は最上位1bitが符号をあらわすbitになります。1bit幅のビットフィールドをsigned intにした場合、その1bitは符号bitになってしまうので、つまり0か-1かしか表現できません。ですので、0,1を表現するために、1bit幅のビットフィールドの型はunsigned intを使ってください。
違反コード
typedef struct {
signed int member_a: 1; // 0 か -1のどちらかになる。1にはならない.
} hoge_t;
コメント