C语言位域

C语言位域教程

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

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

C语言位域使用

一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。

由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过 8 位二进位。

位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。

C语言位域压缩规则

使用位域的主要目的是压缩存储,其大致规则为:

  1. 如果相邻位域字段的 类型 相同,且其位宽之和小于类型的 sizeof 大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止。
  2. 如果相邻位域字段的类型相同,但其位宽之和大于类型的 sizeof 大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍。
  3. 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6 采取不压缩方式,Dev-C++ 采取压缩方式。
  4. 如果位域字段之间穿插着非位域字段,则不进行压缩。
  5. 整个 结构体 的总大小为最宽基本类型成员大小的整数倍。

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 <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; }

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

16_C语言位域.png

我们首先,定义了一个位域 bName,该位域有四个成员,即一个 int 类型的 i、一个 int 类型的 j、一个 int 类型的 a 和一个 double 类型的 b。

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

C语言位域总结

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

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