• 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位的内存。

  • 相关阅读:
    基于velero及minio实现etcd数据备份与恢复
    Pytorch实战 | 第4天:猴痘病识别
    云原生学习笔记-1-docker
    Linux下的第一个小程序--进度条 & 蹦迪炫彩进图条
    【OpenVINO™】在 MacOS 上使用 OpenVINO™ C# API 部署 Yolov5
    SpringMVC源码分析 (2022.08.23)
    读懂:“消费报销”模式新零售打法,适用连锁门店加盟的营销方案
    [附源码]计算机毕业设计游戏交易平台Springboot程序
    性能优化--string 字符串拼接(超详细)
    通过postgres_fdw实现跨库访问
  • 原文地址:https://blog.csdn.net/qq_20490175/article/details/134324276