数据结构 / 结构体位域

结构体位域充分利用把结构体字节,以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语言,linux)