我使用Union的情景
在向arm板发送数据的时候,因为数据段的每个bit含义可能不同,所以需要用结构体,不同位域表示不同的含义,这样修改起来就会方便一些。例如:
struct HomeCtrl {
unsigned short doorCtrl : 1; //位域,第一位表示门控制
unsigned short windowCtrl : 1;
unsigned short lightCtrl : 1;
unsigned short phoneCtrl : 1;
unsigned short refrigeratorCtrl : 1;
unsigned short roombaCtrl : 1;
unsigned short reverse : 27;
}homeCtrl;
int main() {
//如果要打开窗户的话
homeCtrl.windowCtrl = 1;
int windowOpen = 0x2u;
//使用int仅仅是一个操作还好,但是如果操作更多,就会容易出错
//同时,使用结构体修改某个操作的时候只用修改结构体中的变量即可
return 0;
}
而且,接口给的传入参数类型是int,所以我就冒出了一个问题:结构体如何转为int
注意:强制转换是不行的嗷,我没细看,就不乱说原因了
Union是什么
我的理解是:在存储空间中,Union中的不同类型使用相同的空间。使用结构体或者使用int来修改存储空间中的值都是可以的。即多种访问途径共存。
详细的可以参考联合体的使用方法及其本质这篇博客。
Union怎么用
鉴于对于Union的使用大多都是struct中没有位域操作,所以在这里补充这种用法。
#include <iostream>
using namespace std;
union HomeCtrl {
struct homeCtrlStruct {
unsigned doorCtrl : 1;
unsigned windowCtrl : 1;
unsigned lightCtrl : 1;
unsigned phoneCtrl : 1;
unsigned refrigeratorCtrl : 1;
unsigned roombaCtrl : 1;
unsigned reverse : 26;
}ctrlStruct;//struct尽量是1字节,4字节,16字节
unsigned int ctrlInt;
}ctrlUnion;
int main() {
ctrlUnion.ctrlStruct.windowCtrl = 1;
printf("%d\n", ctrlUnion.ctrlInt); //输出2
ctrlUnion.ctrlStruct.refrigeratorCtrl = 1;
printf("%d", ctrlUnion.ctrlInt); //输出18
return 0;
}
至此,我的问题完美解决。我既可以通过修改bit中的内容进行控制数据的修改,又可以使用int类型进行参数传递。
补充:大端小端问题也是使用联合体要注意的。
如有问题,还望指正。如果有用,劳烦点赞。如需转载,注明出处