C语言位域定义语法详解

位域

C语言中的位域也是一种用来存储数据的结构,是比较特殊的结构体struct,其主要作用之一就是为程序软件节省数据的存储空间。这是怎么办到的呢?

在C语言程序中,尤其是嵌入式编程开发当中,有时候存储的信息的大小根本不需要占用一个完整的字节,甚至只需要占一个的二进制位,比如一个开关量只有0和1的状态。位域正是为此而设计的,基本的原理是将一个字节中的二进位根据需求(位域中的位域变量的定义)划分为数个不同的区域,并用来存储不同的C语言对象。

位域定义语法

struct tagName{
   type bitfiledName : bitfiled_length;
}variable-list

位域语法解析

  • C语言位域的定义语法与C语言的结构体struct的定义语法基本类似,重复的地方这里就不再介绍了,可参考之前的章节:C语言结构体struct定义语法及访问成员
  • 位域变量的定义语法为:type bitfiledName : bitfiled_length;这与结构体struct的成员声明不同的地方在于位域大小bitfiled_length的声明,单位为二进制的位数,一般不超过其基本数据类型的大小;
  • 位域变量的个数可以根据需求自定义;

位域使用说明

  • 一个字节可以存放多个位域,而一个位域却只能存放于一个字节中,不可跨字节存储;
  • 位域变量的定义语法为:type bitfiledName : bitfiled_length;这与结构体struct的成员声明不同的地方在于位域大小bitfiled_length的声明;
  • 无名位域,即定义位域变量时,没有定义bitfiledName,无名位域一般用来填充或调整数据的存储位置,而无法被引用,其内容在运行时也是不可预测的;

位域使用语法

位域结构体实例.bitfiledName

位域实例代码

#include <stdio.h>
// 定义位域结构体Xyz
struct Xyz{
    int x : 2;
    int y : 6;
    int z : 8;
}abc;

int main() {
    //因为abc时结构体Xyz的变量,且是全局变量,所以这里就不再实例化了
    abc.x = 1;
    abc.y = 2;
    abc.z = 3;
    printf("%d\n",abc.x);
    printf("%d\n",abc.y);
    printf("%d\n",abc.z);
    return 0;
}

代码编译运行,得到输出:

1
2
3

实例解析

如上实例代码,位域x占据2个二进制位,y则占据6个二进制位,z则占据8个,因此,x和y一般会被存储在同一个字节内,z则是另一个字节内。

免责声明:内容仅供参考,不保证正确性!


全栈后端 / C语言教程 :


















Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.