在做嵌入式开发的时候,我们经常会遇到这样的代码:
struct{unsignedintwidthValidated:1;unsignedintheightValidated:1;}status;
这样定义结构体变量是什么意思呢?
主要原因是:有些信息在存储时,只需占几个或一个二进制位(bit),并不需要占用一个完整的字节。例如,在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为“位域”或“位段”。
位域:是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
位域定义与结构定义相仿,其形式为:
struct位域结构名{位域列表};
其中位域列表的形式为:
type[member_name]:width;
下面是有关位域中变量元素的描述:
位域的使用和结构体成员的使用相同,其一般形式为:
位域变量名.位域名
位域变量名-位域名
位域最大的作用就是节省存储空间,在本质上就是一种结构类型,不过其成员是按二进位分配的。例如以下案例:
/*定义简单的结构*/struct{unsignedintwidthValidated;unsignedintheightValidated;}status1;/*定义位域结构*/struct{unsignedintwidthValidated:1;unsignedintheightValidated:1;}status2;intmain(){printf("Memorysizeoccupiedbystatus1:%d\n",sizeof(status1));printf("Memorysizeoccupiedbystatus2:%d\n",sizeof(status2));return0;}
代码被编译和执行时,它会产生下列结果:
Memorysizeoccupiedbystatus1:8Memorysizeoccupiedbystatus2:4
结构体status1是由正常的两个unsignedint类型变量组成,占用内存是8字节,结构体status2也是unsignedint类型变量,但是它仅使用了一个unsignedint类型内存的前2bit,实际上还有30bit没使用,所以占用内存是4字节。
对于位域的定义有以下几点说明:
一个位域存储在同一个字节中,如一个字节所剩空间不够存放另一位域时,则会从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
structbs{unsigneda:4;unsigned:4;/*空域*/unsignedb:4;/*从下一单元开始存放*/unsignedc:4}
完整资料可进群免费领取!!!
理解电池充电器功能与充电拓扑结构
具有更高输出额定值的适配器通常更贵。为了降低成本,您可能想使用额定值较低的适配器,但这样做需要带有基于电流的DPM功能的充电器,以防止适配器过载。此保护是为了防止总系统负载和电池负载超过适配器可以提供的总功率。例如,bq24133等具有基于电流的DPM的充电器可以处理宽输入电源而不会发生过载(图1)...
10种精密全波整流电路你都吃透了吗?
一图1:经典型图1是最经典的电路,优点是可以在电阻R5上并联滤波电容。电阻匹配关系为R1=R2,R4=R5=2R3;可以通过更改R5来调节增益。二图2:四个二极管图2优点是匹配电阻少,只要求R1=R2。三图3:高输入阻抗型图3的优点是输入高阻抗,匹配电阻要求R1=R2,R4=2R3。四图4:等值...
变压器的主要技术参数和意义详解
变压器对于每一个人来说都听说过,这也是我们随处可见的重要电力设备。本文对变压器的一些详细参数做一下普及。变压器是一种利用交变电磁场实现不同电压等级转换(实际上是电能转换)的装置。转换前后的电压在频率上没有变化。根据用途可分为电力变压器、整流变压器、调压器、隔离变压器、CT、PT等。电力变压器经常出现...
消灭蚊子不用是比尔盖兹,博客传授 DIY 灭蚊法宝
先前《科技新报》报导,为了对抗全世界杀人最多、最致命的可怕动物,也就是传播疟疾、登革热等疾病的蚊子,连全球首富比尔盖兹都必须卷起袖子,献出他珍贵的血来赞助实验,当然比尔盖兹也不只献血,还赞助了无数灭蚊、防蚊的各种计划,希望能降低蚊子对人类的伤害。不过,你不用是全球首富,才能加入这场人类对抗蚊子的圣战...