1 常规编码方式
#include <stdio.h>
typedef union {
struct {
int a : 4;
int b : 4;
int c : 4;
int d : 4;
int rsv : 16;
} valBits;
int val;
} U_TEST_UNION;
int main()
{
U_TEST_UNION uTest = {0};
uTest.val = 0x12345678;
printf("val: 0x%x\n", uTest.val);
printf("a: 0x%x\n", uTest.valBits.a);
printf("b: 0x%x\n", uTest.valBits.b);
printf("c: 0x%x\n", uTest.valBits.c);
printf("d: 0x%x\n", uTest.valBits.d);
printf("rsv: 0x%x\n", uTest.valBits.rsv);
return 0;
}
输出:
常规编码方式
val: 0x12345678
a: 0xfffffff8
b: 0x7
c: 0x6
d: 0x5
rsv: 0x1234
2 省略结构体变量名字
#include <stdio.h>
typedef union {
struct {
int a : 4;
int b : 4;
int c : 4;
int d : 4;
int rsv : 16;
};
int val;
} U_TEST_UNION;
int main()
{
printf("省略结构体变量名编码方式\n");
U_TEST_UNION uTest = {0};
uTest.val = 0x12345678;
printf("val: 0x%x\n", uTest.val);
printf("a: 0x%x\n", uTest.a);
printf("b: 0x%x\n", uTest.b);
printf("c: 0x%x\n", uTest.c);
printf("d: 0x%x\n", uTest.d);
printf("rsv: 0x%x\n", uTest.rsv);
return 0;
}
输出:
省略结构体变量名编码方式
val: 0x12345678
a: 0xfffffff8
b: 0x7
c: 0x6
d: 0x5
rsv: 0x1234
省略结构体变量名方式,可以由上层直接引用结构体成员变量,在如芯片寄存器定义时,可以增强可读性,不用再在中间增加一层变量,如:
定义:
union {
struct {
int ISS : 25;
int IL : 1;
int EC : 6;
};
int REG_VAL;
} HSR;
使用方法:
1)单次给整个寄存器赋值
HSR.REG_VAL = 0x0;
2)给寄存器各个位域赋值
HSR.ISS = 0x0;
HSR.IL = 0x0;
HSR.EC = 0x0;