C 位字段
预计时间: 4分钟
联合是在同一内存位置存储不同的数据类型。
假设您的 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 ;
};
下表描述了位字段的变量元素 -
元素 | 描述 |
---|---|
type | 确定如何解释位域值的整数类型。可以是 int、signed int 或 unsigned int。 |
member_name | 位域的名称。 |
width | 位域中的位数。必须小于或等于指定类型的位宽。 |
以预定义宽度定义的变量称为位域
。一个位域可以容纳多个位;例如,如果您需要一个变量来存储从 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
更新于2022年04月14日