C语言使用位域,C语言位域

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;

}

程序运行后,控制台输出如下图所示:

dd6fc507573305484a6ad7f77147ae9a.png

我们首先,定义了一个位域 bName,该位域有四个成员,即一个

同时,i 占的位数为 8 位,j 占的位数为 4 为,a 占的位数为 3 位,最后,我们使用 sizeof 获取了位域的长度。

C语言位域总结

在 C 语言中,有些数据的存储并不需要占用一个完整的字节,而只需占一个或几个二进制位,这时候,为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为 “位域” 或 “位段”。

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

你可能感兴趣的:(C语言使用位域)