跑调的毕加索
发布于

位字段的理解

typedef struct __tagtomcuproto
{
union
{
struct
{
UINT8 d0_light_lock : 1;
UINT8 d0_light_open : 1;
UINT8 d0_light_soran : 1;
UINT8 d0_light_sred : 1;
UINT8 d0_light_close : 1;
UINT8 d0_light_dail : 1;
UINT8 d0_light_rotate : 1;
} bitfield;
UINT8 d0;
} keylight;
UINT8 lightmode;
UINT8 lightdir;
UINT8 lightspeed;
UINT8 redlightduty;
UINT8 greenlightduty;
UINT8 bluelightduty;
} STRTOMCUPROTO;
位字段(bit fields)允许在结构体中指定每个成员占用的位数。即使基础类型是 UINT8,位字段的大小可以小于基础类型的总位数。以下是关键点:

基础类型:UINT8 表示一个 8 位无符号整数。整个 UINT8 变量的大小是 8 位。

位字段:

位字段是结构体成员的特殊形式,它允许将基础类型的部分位分配给不同的成员。在这个例子中,每个字段仅占用 1 位。
内存布局:

在结构体中,这些 1 位宽的字段会依次排列在 UINT8 的 8 位中。这意味着所有的位字段总共使用 8 位空间,刚好符合一个 UINT8 类型的大小。
存储方式:

尽管每个字段只有 1 位,但它们共用一个 8 位的 UINT8 变量。这些字段在内存中一起存储,按照位字段定义的顺序进行排列

bitfield:这是一个位字段结构体,用于以位为单位表示不同的灯光控制状态。
UINT8 是位字段最大的限制,所有的位加起来不能大于声明的类型

浏览 (182) 点赞 收藏 分享
评论