结构体中的位域

位域(位段)

   1,概念:
   所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。本质上是一种结构类型, 不过其成员是按二进位分配的。   每个域有一个域名,在程序中可以按域名访问对应的二进制区域。 
   位域可以把几个不同的对象用一个字节的二进制位域来表示。
   位域成员应该声明为int、unsigned int或signed int类型(short char long)。

   2,定义格式

   struct <位域标签名>{
           成员类型 成员名称 : 该成员占用的位数; 
           成员类型 成员名称 : 该成员占用的位数;
           .......            .....
           成员类型 成员名称 : 该成员占用的位数; 
    };

   注意事项:
   1.如果一个字节所剩空间不够存放另一位域时,应从下一字节起存放该位域。也可以有意使某位域从下一单元开始
   2.位域的长度不能大于数据类型本身的长度,比如int类型的位域不能能超过32位二进制位。
   3.位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
   struct A     
   {     
    char a:1 ;    
    char  :2 ;   //该2位不能使用   
    char  b:3;     
    char  c:2 ;    
    };  

  struct B{

    char a:3 ;    
    char  :0;   //后面的5位用0填充   
    char  b:3;     //b在下一个字节分配空间  

  }
3,分类

1》成员为同类型,且成员的长度之和小于等于类型的长度
2》成员为同类型,且成员的长度之和大于于类型的长度
3》成员为不同类型 ----长度由编译器决定,在实际使用中,一般很少出现不同类型的位域

实例:

#include
struct bs     
{    
    char a:2;     
    char b:1;     
    char :0;   
    char c:3;   
};  

struct sb{
    char a:3;
    char b:2;
    short s;
    char c:2;
};

int main(void)
{

    int len;
    struct bs bb;
    struct bs *pb;

    pb = &bb;

    len = sizeof(struct bs);
    printf("len = %d\n",len);

    bb.a = 3;
    printf("bb.a = %hhd\n",bb.a & ~(0x3f<<2));    //打印位域,必须取出对应的位打印,否则结果会出错
    bb.c = 5;
    printf("bb.c = %hhd\n",bb.c & ~(0x1f<<3));


    return 0;
}

你可能感兴趣的:(linuxC语言,c语言)