C语言位域教程
在
所谓 “位域” 是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
C语言位域使用
一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过 8 位二进位。
位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
C语言位域压缩规则
使用位域的主要目的是压缩存储,其大致规则为:
如果相邻位域字段的
如果相邻位域字段的类型相同,但其位宽之和大于类型的 sizeof 大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍。
如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6 采取不压缩方式,Dev-C++ 采取压缩方式。
如果位域字段之间穿插着非位域字段,则不进行压缩。
整个
C语言位域详解
语法
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语言位域
C 语言位域定义与使用
#include
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,该位域有四个成员,即一个
同时,i 占的位数为 8 位,j 占的位数为 4 为,a 占的位数为 3 位,最后,我们使用 sizeof 获取了位域的长度。
C语言位域总结
在 C 语言中,有些数据的存储并不需要占用一个完整的字节,而只需占一个或几个二进制位,这时候,为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为 “位域” 或 “位段”。
所谓 “位域” 是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。