在做嵌入式开发的时候,我们经常会遇到这样的代码:
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}
完整资料可进群免费领取!!!
七匹狼航母大秀盛大举行,携全新商旅科技夹克引领行业新风向
2024年4月13日,“七匹狼航母大秀暨2024-2025春夏新品发布会”在上海东方绿舟举行,中国时尚男装领导品牌的实力再一次得到彰显。本次发布会不仅是一席时尚盛宴,更是七匹狼“夹克专家”战略升级的重要里程碑。七匹狼品牌大使魏哲鸣、新生代演员娜然、王子奇及时尚大咖gogoboi宇博的参与,更令现场星...
自动化技术之热继电器型号
热继电器主要用于电机的控制电路中,起着电路过载过热保护的作用。下面我们就来说说热继电器的型号解释,以某一线品牌举例来说明:LRD12CLRD——表示热过载继电器的形式LRD:热元件式,配D09~D38接触器,配LAD-7B106独立安装底座LRD3:热元件式,配D40A~D65A接触器,配LA7-D...
河北省所有高校介绍系列之防灾科技学院#艺信教育
防灾科技学院提供中专、大专、本科教育。防灾科技学院是中央部属高校,隶属于中国地震局。该校是我国唯一一所以防灾减灾高等教育为主的高校。学校成立于1975年,原名天文地震学校。该校成立的初衷是为了应对1966年邢台大地震所带来的严重后果。为了预防自然灾害,国家专门建立了这所学校。2006年,该校升格为本...
科技构筑健康,数字赋能增长,长三角健康科技创新论坛在沪举行
新民晚报讯(记者左妍)由上海长三角商业创新研究院主办,复旦大学管理学院学术支持的首届长三角健康科技创新论坛今天在上海举办。记者从论坛获悉,长三角健康科技创新中心也于当日授牌,上海长三角商创科技基金会健康科技专项公益基金同期启动。为了推动健康科技的研究、发展与应用,商创院联合了融智汇集团、迪安诊断集团...