开发手册 欢迎您!
软件开发者资料库

C - 位字段

C中的位字段 - 从简单和简单的步骤学习C编程,从基本到高级概念,包括C概述,语言基础知识,环境设置,程序结构,基本语法,文字,数据类型,变量,常量,存储类,运算符,决策,功能,范围规则,循环,数组,指针,字符串,结构,联合,位字段,Typedef,输入和输出,头文件,类型转换,错误处理,递归,变量参数,内存管理,预处理器,指令,命令行参数等。

假设您的C程序包含许多TRUE/FALSE变量,这些变量分组在一个名为status的结构中,如下所示 :

struct {   unsigned int widthValidated;   unsigned int heightValidated;} status;

这种结构需要8个字节的存储空间,但实际上,我们将在每个变量中存储0或1.在这种情况下,C编程语言提供了一种更好的利用内存空间的方法.

如果在结构中使用这些变量,那么你可以定义一个告诉C的变量的宽度.编译器,您将只使用那些字节数.例如,上面的结构可以重写如下 :

struct {   unsigned int widthValidated : 1;   unsigned int heightValidated : 1;} status;

上述结构需要4个字节的内存空间用于状态变量,但只有2位用于存储值.

如果最多使用32个变量,每个变量宽度为1位,那么状态结构也将使用4个字节.但是,只要你有33个变量,它就会分配内存的下一个插槽,它将开始使用8个字节.让我们检查以下示例以理解概念 :

#include #include /* define simple structure */struct {   unsigned int widthValidated;   unsigned int heightValidated;} status1;/* define a structure with bit fields */struct {   unsigned int widthValidated : 1;   unsigned int heightValidated : 1;} status2; int main( ) {   printf( "Memory size occupied by status1 : %d\n", sizeof(status1));   printf( "Memory size occupied by status2 : %d\n", sizeof(status2));   return 0;}

编译并执行上述代码时,会产生以下结果 :

Memory size occupied by status1 : 8Memory size occupied by status2 : 4

位字段声明

位字段的声明在结构中具有以下形式 :

  struct { type [member_name]:width; };

下表描述了位字段的变量元素 :

Sr.No.元素&说明
1

type

一种整数类型,用于确定如何解释位字段的值.类型可以是int,signed int或unsigned int.

2

member_name

位字段的名称.

3

宽度

位字段中的位数.宽度必须小于或等于指定类型的位宽.

变量使用预定义宽度定义的文件称为位字段.位字段可以容纳多个位;例如,如果您需要一个变量来存储0到7之间的值,那么您可以定义一个宽度为3位的位字段,如下所示;

struct {   unsigned int age : 3;} Age;

上述结构定义指示C编译器年龄变量将仅使用3位来存储该值.如果您尝试使用超过3位,那么它将不允许您这样做.让我们尝试以下示例 :

#include #include struct {   unsigned int age : 3;} Age;int main( ) {   Age.age = 4;   printf( "Sizeof( Age ) : %d\n", sizeof(Age) );   printf( "Age.age : %d\n", Age.age );   Age.age = 7;   printf( "Age.age : %d\n", Age.age );   Age.age = 8;   printf( "Age.age : %d\n", Age.age );   return 0;}

当编译上面的代码时,它将编译并发出警告,并在执行时产生以下结果 :

Sizeof( Age ) : 4Age.age : 4Age.age : 7Age.age : 0