C - 位字段
假设您的 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 <stdio.h> #include <string.h> /* 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 : 8 Memory size occupied by status2 : 4
位域声明
位域的声明在结构中具有以下形式 -
struct { type [member_name] : width ; };
下表描述了位字段的变量元素 -
先生。 | 元素和描述 |
---|---|
1 | 类型 确定如何解释位字段的值的整数类型。类型可以是 int、signed int 或 unsigned int。 |
2 | 成员名字 位字段的名称。 |
3 | 宽度 位字段中的位数。宽度必须小于或等于指定类型的位宽度。 |
以预定义宽度定义的变量称为位字段。一个位字段可以容纳多个位;例如,如果您需要一个变量来存储从 0 到 7 的值,那么您可以定义一个宽度为 3 位的位字段,如下所示 -
struct { unsigned int age : 3; } Age;
上面的结构定义指示 C 编译器,age 变量将仅使用 3 位来存储值。如果您尝试使用超过 3 位,那么它将不允许您这样做。让我们尝试下面的例子 -
#include <stdio.h> #include <string.h> 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 ) : 4 Age.age : 4 Age.age : 7 Age.age : 0