• C语言中的位域


    什么是位域

    位域,或称位段,是C语言中的一种特殊结构体成员,允许我们按位对成员进行定义,指定其占用的位数。这种特性使得位域在存储和处理某些数据时非常高效,比如多个开关变量仅需要存储0或1的情况。

    为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为“位域”或“位段”。位域把一个字节中的比特位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

    需要注意的是,C语言标准并没有规定位域的具体存储方式,不同的编译器有不同的实现,但它们都尽量压缩存储空间。例如,当相邻成员的类型相同时,如果它们的位宽之和小于类型的sizeof大小,那么后面的成员紧邻前一个成员存储,直到不能容纳为止;如果它们的位宽之和大于类型的sizeof大小,那么后面的成员将从新的存储单元开始,其偏移量为类型大小的整数倍。

    另外,对于位域表示的范围通常不能超过其所依附类型所能表示的bit数。例如:在上面的bitfield结构体中,位域所依附的类型是unsigned int, 最大能表示32个bit,也就是说,n0、n1、n2...nk总bit数不能超过32,每个成员超过指定bit表示的最大数值时会被截断。

    位域举例

    以下是一些位域的使用实例:

    使用位域来表示一个标志组合:
    struct Flags {
        unsigned int flag1 : 1;
        unsigned int flag2 : 2;
        unsigned int flag3 : 3;
    };

    在这个例子中,flag1、flag2和flag3分别用1位、2位和3位来表示。总共占满了一个unsigned int类型的空间。

    控制结构体成员所占用的二进制位数:
    struct bs{
        unsigned m;
        unsigned n: 4;
        unsigned char ch: 6;
    };

    在这个例子中,成员m没有限制,根据数据类型推算出它占用4个字节(Byte)的内存。而成员n和ch被后面的数字限制,它们分别占用4位和6位的内存。

  • 相关阅读:
    Python搭建虚拟环境
    腾讯产品经理的自动化工作流
    酷柚易汛ERP - 系统初始化操作指南
    LLaMA Factory多卡微调的实战教程
    Spring Security—配置(Configuration)
    MES管理系统中,物料BOM为何如此重要
    python统计字符串字符出现次数
    ES6异步编程解决方案——async、Generator、Promise
    PWN 基础篇 Write Up
    CentOS7安装jdk
  • 原文地址:https://blog.csdn.net/qq_20490175/article/details/134324276