在C语言中,有很多的关键字。
//如以下关键字:
int;short;long;struct;union;enum......
当时学习时,就觉得union和enum没有什么用处。
因为union和enum可以干的事,struct和定义变量都可以直接解决。
直到后来,自己想写一个寄存器的时候才发现union的作用还是比较明显的。
寄存器操作可以大致分成:
- 对寄存器整体进行赋值。
Register =0x8;//也就是对寄存器二进制的幅值1000,高位为1其余为零。
- 对寄存器的某一位赋值。
//有的寄存器可以直接赋值。假设ocp就是Register的第4位。
ocp=1;//对寄存器的某一位直接幅值。
//若没有这种位幅值的捷径,如果整体赋值可能会改变其他位的数值。特别是当我们不知道其他位应该是啥时,通常将寄存器整体拿出来然后进行处理。
val_Register=Register;
Register = val_Register | 0x8;
显然,以上方法第一种更加具有可读性。若要实现对建立寄存器的位操作,不用union就比较难是实现。
因为union的作用是:而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
可以使用以下方法定义一个寄存器:
union jicunqi
{
u4 all; //假设是一个4位的
struct wei
{
u4 others:3;
u4 ocp:1;
}bit;
}Register;
该方法可以整体赋值也可以按位赋值。
//整体幅值
Register.all = 0x8;
//位幅值
Register.bit.ocp= 1;
好像就是这么回事。