目录
一.位域的概念
二.语法格式
三.无名位域
四.视频教程
一.位域的概念
有些数据在存储的时候并不需要一个完整的字节。比如使用一个变量表示开关的状态,开关只有开和关俩个状态,所以只需要使用0和1表示,也就是一个二进制位。所以这时候使用一个完整的字节就比较浪费内存,正是基于这种考虑,C语言提供了一种数据结构,叫做位域。
二.语法格式
在结构体成员后面使用冒号(:)和数字表示改成员所占的位数。
struct Test
{
unsigned int a:1;
unsigned int b:2;
unsigned int c:3;
};
注意:位域的宽度不能超过数据类型的长度
举例:
#include <stdio.h>
struct TEST
{
unsigned int a:1;
unsigned int b:2;
unsigned int c:3;
};
int main(void)
{
struct TEST test;
test.a = 1;
test.b = 2;
test.c = 3;
printf("sizeof = %ld\n",sizeof(test));
return 0;
}
运行结果:
原因:
实际a、b、c一共占用6bit,还有26bit空间为保留的空白
三.无名位域
位域成员可以没有名称,只给出数据类型和位宽即可。一般用来作填充或者调整成员位置。因为没有名称,无名位域不能使用。
举例:
#include <stdio.h>
struct TEST
{
unsigned int a:20;
unsigned int :20;
unsigned int c:3;
};
int main(void)
{
struct TEST test;
test.a = 1;
//test.b = 2;
test.c = 3;
printf("sizeof = %ld\n",sizeof(test));
return 0;
}
运行结果:
原因:
如果没有位宽为12的无名成员,a、c 将会挨着存储,sizeof的结果为 4;有了这12位作为填充,a、c将分开存储,sizeof的结果为 8。
四.视频教程
78.位域_哔哩哔哩_bilibili