欢迎大家来到IT世界,在知识的湖畔探索吧!
在做嵌入式开发的时候,我们经常会遇到这样的代码:
struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status;
欢迎大家来到IT世界,在知识的湖畔探索吧!
这样定义结构体变量是什么意思呢?
主要原因是:有些信息在存储时,只需占几个或一个二进制位(bit),并不需要占用一个完整的字节。例如,在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为“位域”或“位段”。
1、概念和定义
位域:是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
位域定义与结构定义相仿,其形式为:
欢迎大家来到IT世界,在知识的湖畔探索吧!struct 位域结构名 { 位域列表 };
其中位域列表的形式为:
type [member_name] : width ;
下面是有关位域中变量元素的描述:
欢迎大家来到IT世界,在知识的湖畔探索吧!
欢迎大家来到IT世界,在知识的湖畔探索吧!位域变量名.位域名位域变量名->位域名
位域最大的作用就是节省存储空间,在本质上就是一种结构类型,不过其成员是按二进位分配的。例如以下案例:
#include <stdio.h> #include <string.h> /* 定义简单的结构 */ struct { unsigned int widthValidated; unsigned int heightValidated; } status1; /* 定义位域结构 */ struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status2; int main( ) { printf( "Memory size occupied by status1 : %d\n", sizeof(status1)); printf( "Memory size occupied by status2 : %d\n", sizeof(status2)); return 0; }
代码被编译和执行时,它会产生下列结果:
欢迎大家来到IT世界,在知识的湖畔探索吧!Memory size occupied by status1 : 8 Memory size occupied by status2 : 4
结构体status1是由正常的两个unsigned int类型变量组成,占用内存是8字节,结构体status2也是unsigned int类型变量,但是它仅使用了一个unsigned int类型内存的前2bit,实际上还有30bit没使用,所以占用内存是4字节。
对于位域的定义有以下几点说明:
- 一个位域存储在同一个字节中,如一个字节所剩空间不够存放另一位域时,则会从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
struct bs{ unsigned a:4; unsigned :4; /* 空域 */ unsigned b:4; /* 从下一单元开始存放 */ unsigned c:4 }
完整资料可进群免费领取!!!
嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!
点击这里找小助理0元领取:扫码进群领资料
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/99377.html