Union的使用(结构体如何转为int)

我使用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类型进行参数传递。

补充:大端小端问题也是使用联合体要注意的。

如有问题,还望指正。如果有用,劳烦点赞。如需转载,注明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值