• C语言 - 位段


    位段

    • 什么是位段?
      C语言允许在一个结构体中以比特位(bit)为单位来指定其成员所占内存长度
      这种以位为单位的成员称为位段。利用位段能够用较少的位数存储数据。

    例题:
    在这里插入图片描述

    • 上面的 _a : 2 意思是占 2 个bit位
      _b : 5 意思是占 5 个bit位
      _c : 10 意思是占 10 个bit位
      _d : 30 意思是占 30 个bit位

    • 复习一下知识:
      8 bit = 1 字节
      4 字节 = 一个整形(int)

    上面所有成员加起来也就是 47 bit,大概就是 二个整形的大小
    那答案为什么是 8 ?
    那么上面的例题中的结构体中位段是怎么分配空间的呢?

    位段的内存分配

    1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
    2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
    3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段
    4. 位段占的二进制位数不能超过该基本类型所能表示的最大位数
      即位段不能跨字节存储。例如:int是占4个字节,那么最多只能是32 bit位,不能超过它

    例题:

    struct S
    {
     char a:3;
     char b:4;
     char c:5;
     char d:4;
    };
    int main()
    {
    	struct S n = { 0 };
    	n.a = 10;
    	n.b = 12;
    	n.c = 3;
    	n.d = 4;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    图解:
    这是在 vs 2022编译器测试数据

    在这里插入图片描述

    在这里插入图片描述

    • 之前说过位段的空间上是按照4个字节( int )或者1个字节( char )的方式来开辟的
      所以一次是开辟 4个int 类型的空间
    • 位段在一个字节内部的数据是先使用低地址在使用高地址,从右向左使用(char 类型)
      如果是 int 类型,是一个整形从右向左
    • 当一块空间里剩余的空间不够下一个成员使用时,会浪费掉
    • 在位段中不给其起名字,无法访问该位段,但是计算大小是仍占空间
    • 不可对位段进行 &取地址 操作

    位段的跨平台问题

    1. int 位段被当成有符号数还是无符号数是不确定的。
    2. 位段中最大位的数目不能确定
      例如:16位机器最大16,32位机器最大32,写成27,在16位机
      器会出问题。
    3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
    4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
      舍弃剩余的位还是利用,这是不确定的。
    • 总结:跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在
  • 相关阅读:
    微生物学检验试剂——博迈伦
    【nowcoder】排序子序列、倒置字符串
    odoo javascript参考(七)
    单例模式定义及其基础示例
    【C语言】break 关键字
    前后端传输加密代码-java
    文件权限rwx与数字解释
    Seata概述
    创建NuGet本地包源
    深入理解嵌入式系统【基于Arduino的嵌入式系统入门与实践】相关基础知识概述:嵌入式系统/技术(定义、分类、组成、简介);Arduino开发板分类;VCC,GND;模拟信号和数字信号;杜邦线,面包板
  • 原文地址:https://blog.csdn.net/m0_66483195/article/details/125631507