揮発性のメモ2

http://d.hatena.ne.jp/iww/

ビットフィールドの詰め方

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 があり、ひっくり返すこともできたらしい。