gcc はビットフィールドが右詰め固定、LSBから順に使っていく
#include <stdio.h> typedef union { unsigned int a; struct { unsigned int b1:4; unsigned int b2:4; unsigned int b3:4; unsigned int b4:4; unsigned int b5:4; unsigned int b6:4; unsigned int b7:4; unsigned int b8:4; } b; } u_test; int main(void) { u_test q; q.a = 0x12345678; printf("%08X\n",q.a); printf("%d,%d,%d,%d,%d,%d,%d,%d\n" ,q.b.b1,q.b.b2,q.b.b3,q.b.b4,q.b.b5,q.b.b6,q.b.b7,q.b.b8 ); return 0; }
12345678 8,7,6,5,4,3,2,1
HEWなどは左詰め、MSBから取っていくそうなので、ビットフィールドのヘッダは使いまわしが効かない。
昔 gcc4.1 とかの頃には reverse_bitfields などの pragma があり、ひっくり返すこともできたらしい。