我有一个结构体,对应硬件的寄存器。
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.s.h = 1.
虽然第三个字是0x80000000,但是obj.s.h显示为1,我不理解这个现象。我在powerpc上运行此代码,其中第一个位域是最高有效位。
printf("sizeof(obj) is %d bytes\n", sizeof(obj));
- 位域的打包方式非常依赖于编译器。 - Roddy