位域结构体操作

定义:位域结构体和结构体类似,只是变量a:1,这个表示a占一位,但本身a是4个字节大小,并且成员存储是从低到高,
struct
{
unsigned int a:1;
unsigned int b:1;
unsigned int u:1;
unsigned int i:1;
}prnt;
#include

struct pack
{
unsigned a:2; // 取值范围为:0~3 ///这个范围是位数所能表示的最大是数值范围,2的2次方,表示4个数,就是从0-3
unsigned b:4; // 取值范围为:0~15
unsigned c:6; // 取值范围为:0~63
};

int main(void)
{
struct pack pk1;
struct pack pk2;

// 给pk1各成员赋值并打印输出
pk1.a = 1;
pk1.b = 10;
pk1.c = 50;
printf("%d, %d, %d\n", pk1.a, pk1.b, pk1.c);

// 给pk2各成员赋值并打印输出
pk2.a = 5;
pk2.b = 20;
pk2.c = 66;
printf("%d, %d, %d\n", pk2.a, pk2.b, pk2.c);

return 0;
}

位域存储:会出现字节对齐,
#include
struct pack
{
unsigned a:2;
unsigned b:4;
unsigned c:6;
};
int main(void)
{
printf(“sizeof(struct pack) = %d”, sizeof(struct pack));
return 0;
}

程序输出结果为:

sizeof(struct pack) = 4
解析:a,b,c总共占12bit,一个字节不到,所以会全部放在一个字节,由低向高,而最小变量类型就是 4个字节为单位,所以最后结果是4,

例子2:
struct pack
{
unsigned a:12;
unsigned b:24;
unsigned c:6;
};
结果: sizeof(struct pack) = 8
最小对齐类型:4字节,a.b超了一个类型,所以a,独占一个4字节,然后b.c刚好在一个最小类型里面,共同占4,最后结果8字节
例子3:
位域结构体操作_第1张图片
可见最小类型:16位,但后面控制的位需要两个类型(一个类型2字节),所以该结构体大小:4个字节

例子4:自动对齐,当成员控制位与最小类型单元填满
位域结构体操作_第2张图片
位域结构体操作_第3张图片
上述可见,c控制3位是在这个寄存器中间,但似乎在结构体中,并没有按从低到高顺序,定义这个位成员,这就是所有成员刚好对应,没有重复的,比如要是有两个3位控制成员呢,就不能对应到那个3,位,所以只有一个,读出来的值就是c就是唯一的那个三位,

你可能感兴趣的:(c语言,stm32,数据结构)