位域
位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位
2 .位域定义与结构定义相仿,其形式为:
struct 位域结构名
{
位域列表
};
其中位域列表的形式为: 类型说明符 位域名:位域长度
例如:
struct bs
{
int a:8; //一个字节
int b:2; //一个字节前高6 bit
int c:6; //字节的下2 bit
};
先看个例子,测试一下位域结构体的大小:
#include<stdio.h>
int main()
{
struct s1
{
int i:8;
int j:4;
int a:3;
double b ;
};
printf("%d",sizeof(struct s1));
return 0;
}
16
Press any key to continue
其实位于结构体也可以按平时所用的结构体,进行访问,赋值,
操作大同小异,不过现在操作的更小,bit而已。
#include<stdio.h>
main()
{
struct bs
{
unsigned int a:1;
unsigned int b:3;
unsigned int c:4;
} bit,*pbit;
printf("%d\n",sizeof( struct bs));
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit-> a=0;
pbit->b &=3; //双目运算符,从右到左 pbit -> b = pbit->b & 3;
pbit->c|=1; //pbit -> c = pbit -> c | 1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}
运行结果:
4
1,7,15
0,3,15
Press any key to continue
干货: 这可能是笔试题中与内存对齐同等的题型
使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则有转化为内存对齐问题
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
#include<stdio.h>
main()
{
struct test1
{
char a:1;
char :2; //一个字节
// + 3 字节
long b:3; // 4字节 类型不匹配,所以要进行内存对齐
char c:2; // 1字节
//共9字节,但要自身内存对齐 所以为12,byte
};
printf("%d\n",sizeof(struct test1));
}
运行结果:
12
Press any key to continue