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