まず、それは可能ですか?はいの場合、以下の宣言で何が間違っていますか?
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あり、これらの型から作成されたビットフィールドは準拠していません。