一文读懂C语言位域/位段

在做嵌入式开发的时候,我们经常会遇到这样的代码:

struct{unsignedintwidthValidated:1;unsignedintheightValidated:1;}status;

这样定义结构体变量是什么意思呢?

主要原因是:有些信息在存储时,只需占几个或一个二进制位(bit),并不需要占用一个完整的字节。例如,在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为“位域”或“位段”。

1、概念和定义

位域:是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

位域定义与结构定义相仿,其形式为:

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-11-19
26
目录

    推荐阅读