数据结构 / 结构体位域

结构体位域充分利用把结构体字节,以bite为单位。例如:存储性别,可以使用二进制0或1表示

1. 格式

    struct 结构体位域名
    {
        数据类型 位域名:位域大小;
        ......            
    };

  • 结构体位域名:满足命名规范
  • 数据类型:不可以是float double,可以是char short int long longlong unsigned char...
  • 位域名:满足命名规范,可有可无
  • :; 均不可以省略
  • 位域大小:不允许超过数据类型的位数
struct A
        {
            char a:1;
            int b:2;        
        };

struct B
        {
            char a:3;
            int :4;   // 省略位域名,该4位不使用,默认使用0填充
            short c:5;     
        };

2. 结构体位域的大小计算

  • 总位数小于最宽成员的字节数

struct A
    {
        int a:8;
        int b:6;
        int c:2;    
    };
    // 最宽成员int,4字节,32位
    // 8+8+2<32  ,按32计算字节大小
  • 总字节超过最宽成员的字节数,变量不可以跨字节存放

    struct B
    {
        int a:20;
        int b:15;
        int c:10;    
          
    };
    // 最宽成员int,4字节,32位
    // a:20位,剩余12位,存放b空间就不够了,需要重新开辟最宽成员的字节大小,开辟32位
    // b占用15位,c占用10位,剩余7位使用0填充
    // 共8字节

  • 数据类型不一致时,以最宽成员的字节进行开辟空间

    struct C
    {     
        char a:7;
        int b:20; 
        long c:60;         //8  
        char d:5;
    };
    // 最宽成员long,8字节,64位
    // 7+20=27  64位剩余37位,不够存储c,所以重新开辟8字节的大小
    // c占60位,剩余4位,但是d占5位不够存储,重新开辟8字节存储
    // 共:24字节

### C语言结构体的使用方法和特性 #### 的基本概念 在C语言中,(Bit Fields)是一种特殊的数据结构,它允许程序员在一个字节内定义多个二进制字段。这使得可以在有限的空间内存储多个布尔值或枚举值[^1]。 #### 定义的方式 通过在结构体内声明成员变量并指定其宽度来实现。基本语法如下: ```c struct { unsigned int member1 : n1; unsigned int member2 : n2; } yourStructName; ``` 其中 `unsigned int` 表示成员的数据类型,可以是 `signed int`, `unsigned int` 或 `_Bool`;而冒号后的数字指定了该成员占据多少个比特[^4]。 #### 实际应用案例 下面是一个具体的例子展示了如何创建包含不同长度结构体: ```c typedef struct _net_pro_cdu { unsigned char acs : 4; // 占用前四 unsigned char : 0; // 不占任何, 起分隔作用 unsigned char ace : 4; // 接着占用后面的四个置 unsigned char dve : 4; // 新的一组四比特序列 } Ncdu; ``` 这里定义了一个名为Ncdu的新类型,内部有三个分别占有4bit空间的成员acs、ace以及dve,并且还有一个匿名零宽用来强制结束当前字节边界上的填充[^3]。 #### 平台依赖性与移植注意事项 值得注意的是,尽管能够有效地利用内存资源,但由于编译器之间存在差异,对于相同代码片段所产生的实际布局可能有所不同。这意味着当涉及到跨平台开发时,应当特别注意确保程序逻辑不会受到这种不确定性的负面影响[^2]。 #### 组合运用——联合体配合 除了单独作为结构体的一部分外,还可以将与其他高级特性结合起来使用。比如把放在联合体内可以让同一块物理地址既能按整体读写又能逐操作,从而进一步增强了灵活性[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值