まず、それは可能ですか?はいの場合、以下の宣言で何が間違っていますか?
struct mybitfields
{
uint8_t a : 4;
uint16_t c : 12;
} test;
あなたがしていることは可能ですが、移植性はありません: C99 標準では、ビットフィールドの基本型は_Bool
、signed int
、またはunsigned int
である必要があり、実装定義の型をビットフィールドで使用できるようになっています (C90 では、符号なしの署名が必要です) int
。ビットフィールドの基本型; 他の型は許可されていません)。
C99 および C90 標準の適切な章への参照については、この回答を参照してください。
struct
よりも小さいサイズのビット フィールドのを定義することが目標である場合はunsigned int
、移植性のためにビット シフトを使用することをお勧めします。
コードはほとんどのコンパイラで受け入れられますが、厳密に言えば、ビットフィールドの基本型は(signed / unsigned) int
.
uint8_t
は の typedef でunsigned char
あり、uint16_t
おそらく の typedef でunsigned short
あり、これらの型から作成されたビットフィールドは準拠していません。