C语言 - 位字段(Bit)

C语言 - 位字段(Bit) 首页 / C语言入门教程 / C语言 - 位字段(Bit)

假设您的C程序包含许多TRUE/FALSE变量,这些变量按称为状态的结构分组,如下所示-

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个变量。

#include <stdio.h>
#include <string.h>

/* 定义简单结构 */
struct {
   unsigned int widthValidated;
   unsigned int heightValidated;
} status1;

/* 定义一个带有位字段的结构 */
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

Bit Fields声明

位域的声明在结构内部具有以下形式-

struct {
   type [member_name] : width ;
};

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

Sr.No.Element & 描述
1

type

类型可以是int,signed int或unsigned int。

2

member_name

位字段的名称。

3

width

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

链接:https://www.learnfk.comhttps://www.learnfk.com/c-programming/c-bit-fields.html

来源:LearnFk无涯教程网

以预定义宽度定义的变量称为位字段,一个位字段可以容纳多个位;如果您需要一个变量来存储从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

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

赵成的运维体系管理课 -〔赵成〕

程序员进阶攻略 -〔胡峰〕

Linux性能优化实战 -〔倪朋飞〕

数据分析实战45讲 -〔陈旸〕

后端技术面试 38 讲 -〔李智慧〕

Flink核心技术与实战 -〔张利兵〕

性能优化高手课 -〔尉刚强〕

快手 · 移动端音视频开发实战 -〔展晓凯〕

AI大模型系统实战 -〔Tyler〕

好记忆不如烂笔头。留下您的足迹吧 :)