ハードウェアのレジスタに対応する構造体があります。
typedef unsigned int uint32;
typedef union A_u{
uint32 words[4];
struct {
uint32 a : 2;
uint32 b : 3;
uint32 unused : 27;
uint32 c : 2;
uint32 d : 3;
uint32 unused0 : 27;
uint32 unused1 : 1;
uint32 e : 1;
uint32 f : 1;
uint32 g : 1;
uint32 h : 1;
uint32 i : 1;
uint32 unused2 : 26;
uint32 reserved6 : 32;
}s;
}A_t;
main()
{
A_t obj;
uint32 val = 1;
memset(&obj, 0, sizeof(A_t));
//fills data
read_data(&obj);
printf("0x%x\n", obj.words[2]);
printf("obj.s.h = %d\n", obj.s.h);
}
出力は
0x80000000
obj.sh = 1。
3ワード目は0x80000000なのに、obj.shが1と表示されていてよくわかりません。最初のビットフィールドが最上位ビットであるpowerpcでこれを実行しています。