私が見つけた関連する引用は、C99からの6.7.2.1(1)です:
実装は、ビットフィールドを保持するのに十分な大きさのアドレス可能なストレージユニットを割り当てることができます。十分なスペースが残っている場合、構造内の別のビットフィールドの直後に続くビットフィールドは、同じユニットの隣接するビットにパックされます。十分なスペースが残っていない場合、収まらないビットフィールドが次のユニットに配置されるか、隣接するユニットとオーバーラップするかは、実装によって定義されます。ユニット内のビットフィールドの割り当て順序(高次から低次または低次から高次)は、実装によって定義されます。アドレス指定可能なストレージユニットの配置は指定されていません。
unsigned
これは実際には「基になるユニット」タイプではなく、ビットフィールド宣言自体の一部にすぎないと思います。つまり、 「 nビットのタイプT : n
を取る」という意味です。本当の問題は、実装が「大きな」ユニットを選択する必要があるかどうかです。たとえば、ユニットをaにすることで、 3バイトを使用できます。1つは、、1つは、、最後の1つは。または、ユニットを16ビット整数にすることもできます。その場合、1つのユニットのみを使用する必要があります。T
char
v1
v2
v3, v4
ただし、ご指摘のとおり、ユニット内のビットフィールドの順序は指定されていません。Cのデータのアトミック単位はアドレスであり、ビットフィールドにはアドレスがありません。構造体メンバーのアドレスは宣言順に増加することが保証されていますが、ビットフィールドについて(基礎となるユニットについてのみ)そのようなステートメントを作成することはできません。