联合体和结构体混用

在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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值