ビットフィールド内のメンバの型は signed int または unsigned int とすること。省略形として signed / unsigned でも可。
このとき、VC2008 では signed とすると符号ビットがとられる様で、int との比較でイコールにならない。
struct bit {
signed b0:1;
signed b1:1;
signed b2:1;
} bitfield;
....
bitfield.b0 = 1;
if (bitfield.b0 == 1) {
// VS2008 の場合、b0 は比較の際に符号拡張されて-1と評価、
// こちらの分岐には入ってこない
// R8C 用コンパイラではこちらに入ってくる。
}
************
struct bit {
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
} bitfield;
....
このように unsigned にしておいた方が安全
このとき、VC2008 では signed とすると符号ビットがとられる様で、int との比較でイコールにならない。
struct bit {
signed b0:1;
signed b1:1;
signed b2:1;
} bitfield;
....
bitfield.b0 = 1;
if (bitfield.b0 == 1) {
// VS2008 の場合、b0 は比較の際に符号拡張されて-1と評価、
// こちらの分岐には入ってこない
// R8C 用コンパイラではこちらに入ってくる。
}
************
struct bit {
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
} bitfield;
....
このように unsigned にしておいた方が安全