C-位域

作者: 小石头呢 | 来源:发表于2019-08-05 11:52 被阅读0次

    位域:是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

    一.位域的定义使用

    struct 位域结构名{
      type [member_name] : width ;
      type [member_name] : width ;
      ...
    } 位域变量说明;
    
    • type:整数类型,决定了如何解释位域的值。类型可以是整型、有符号整型、无符号整型。
    • member_name:位域的名称。
    • width:位域中位的数量。宽度必须小于或等于指定类型的位宽度。
    #include <stdio.h>
    #include <string.h>
     
    /* 定义简单的结构 */
    struct{
      unsigned int widthValidated;
      unsigned int heightValidated;
    } status1;
     
    /* 定义位域结构 */
    struct{
      unsigned int widthValidated : 1;
      unsigned int heightValidated : 1;
    } status2;
     
    int main( ){
       printf( "Memory size occupied by status1 : %d\n", sizeof(status1));
       printf( "Memory size occupied by status2 : %d\n", sizeof(status2));
     
       return 0;
    }
    
    //运行结果
    Memory size occupied by status1 : 8
    Memory size occupied by status2 : 4
    

    定义一个位域变量和定义枚举和结构体变量类似,同样有三种方式

    二.位域的存储大小

    • 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;

    • 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

    • 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的

    • 整个结构体的总大小为最宽基本类型成员大小的整数倍。

    //不能合并10>sizeof(char)
    typedef struct  AA{
           unsigned char b1:5;
           unsigned char b2:5;
           unsigned char b3:5;
           unsigned char b4:5;
           unsigned char b5:5;
    }AA;/*sizeof(AA) = 5*/
     
    //可以合并10<sizeof(unsigned int)
    typedef struct  BB {
           unsigned int b1:5;
           unsigned int b2:5;
           unsigned int b3:5;
           unsigned int b4:5;
           unsigned int b5:5;
    }BB;/*sizeof(BB) = 4*/
     
    typedef struct  CC {
            int b1:1;
            int :2;//无影响
            int b3:3;
            int b4:2;
            int b5:3;
            short b6:4;
            int b7:1;
          
    }CC; /*sizeof(CC) = 12*/
    
    #include <stdio.h>
    #include <string.h>
     
    struct{
      unsigned int age : 3;
    } Age;
     
    int main( ){
       Age.age = 4;
       printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
       printf( "Age.age : %d\n", Age.age );
     
       Age.age = 7;
       printf( "Age.age : %d\n", Age.age );
     
       Age.age = 8; // 二进制表示为 1000 有四位,超出
       printf( "Age.age : %d\n", Age.age );
     
       return 0;
    }
    
    //运行结果
    Sizeof( Age ) : 4
    Age.age : 4
    Age.age : 7
    Age.age : 0
    

    相关文章

      网友评论

          本文标题:C-位域

          本文链接:https://www.haomeiwen.com/subject/pnsydctx.html