位域(位段)
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 <stdio.h>
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;
}