在 C 语言 中,有些数据的存储并不需要占用一个完整的字节,而只需占一个或几个 二进制 位,这时候,为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为 “位域” 或 “位段”。
所谓 “位域” 是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过 8 位二进位。
位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
使用位域的主要目的是压缩存储,其大致规则为:
struct bName
{
type1 varname1:len1;
type2 varname2:len2;
type3 varname3:len3;
};
参数 | 描述 |
---|---|
bName | 位域名。 |
type1 | 位域字段类型。 |
varname1 | 位域字段名。 |
len1 | 位域字段长度。 |
我们定义了一个位域,bName,其有三个成员,分别为 varname1、varname2 和 varname3。它们的数据类型分别为 type1、type2 和 type3,所占的位数分别为 len1、len2 和 len3。
C 语言位域定义与使用
#include <stdio.h>
struct bName
{
int i:8;
int j:4;
int a:3;
double b;
};
void main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int sizeBName = sizeof(struct bName);
printf("SizeBName = %d\n", sizeBName);
return 0;
}
程序运行后,控制台输出如下图所示:
我们首先,定义了一个位域 bName,该位域有四个成员,即一个 int 类型的 i、一个 int 类型的 j、一个 int 类型的 a 和一个 double 类型的 b。
同时,i 占的位数为 8 位,j 占的位数为 4 为,a 占的位数为 3 位,最后,我们使用 sizeof 获取了位域的长度。
在 C 语言中,有些数据的存储并不需要占用一个完整的字节,而只需占一个或几个二进制位,这时候,为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为 “位域” 或 “位段”。
所谓 “位域” 是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。