联合体和结构体混用

在C语言中,联合体(union) 是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。但是,在任何时候,只有一个成员可以有值,因为所有的成员都共享同一块内存空间。

今天做项目遇到了个很巧妙的结构体和联合体混用的写法,现将其记录下来。

typedef union
{

uint16_t all;
STATUS_FLAGS bit;

}rstatus;

typedef struct
{
u16 temp_err:1; /*占一个字节*/
u16 pos_err :1;
u16 unvol_err:1;
u16 brake:1;
u16 ocur_err:1;
u16 memiry_err:1;
u16 encoder_err:1;
u16 vol:8;/*占8个字节*/
}
STATUS_FLAGS   /*合起来的话就是:temp_err到encoder_err一共占8个字节,且位于低八位,最低位是temp_err,vol一共占8个字节,且位于高八位*/


/*由于rstatus.all和STATUS_FLAGS bit共用一个地址,故当需要判断报错情况时,可以根据rstatus.all的值进行判断,大大减少了代码量和内存空间*/

例如:当unvol_err=1,vol值为9,而其它err值全为0时(我指的是十进制值),那么rstatus.all=2308; 具体算法为:低八位为:0010 0000  高八位为:1001(9的二进制),将其合并得 HEX:904 换算为十进制为2308;

在C++中,联合体(Union)和结构体(Struct)的主要区别在于内存管理和成员间的共享性: 1. **内存占用**[^1]: - 结构体:每个成员单独分配空间,即使它们的类型不同,也会各自占用足够的内存来存储最大的成员。例如,`struct U1`在代码1中占用了12个字节。 - 联合体:所有成员共用同一片内存区域,只有第一个赋值的成员实际占据空间,其他未赋值的成员会被忽略。所以,`union U2`仅占用了4个字节,因为一旦给`char a`赋值,它占据了整个空间。 2. **成员访问**: - 结构体:每个成员都有独立的名称和地址,可以通过`.`操作符访问。 - 联合体:虽然成员有名字,但它们在内存中是相互覆盖的。因此,任何时候只能有一个成员是活动的(即存储有效数据),其余成员的值取决于最后一个赋值的操作。 3. **类型安全性和初始化**: - 结构体:每个成员具有自己的类型,编译器会检查类型的兼容性,允许安全地混合不同类型。 - 联合体:所有成员统一为最宽的类型,如果尝试赋予不匹配类型的值,可能会导致不可预测的结果。 4. **用途示例**[^2]: - 结构体通常用于组合相关的数据,比如一个包含姓名和年龄的学生结构。 - 联合体常用于节省内存,如在一个小的空间里储存可能变化的数据,如音频流的当前状态(可能是位、字节或整数)。 相关问题--: 1. 联合体结构体在内存管理上的具体实现是什么? 2. 如果我想在联合体内存储不同类型的数据,应该怎么做? 3. 结构体联合体在初始化时有什么不同?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值