C/C++ 位域总结
最近接触到了位域这个概念,大家都知道字节是内存寻址的最小单元,但有时我们仅需要几位的二进制空间来存储数据,c语言定义了位域帮助更加接近底层,按照需求来分配空间,将1bit 分为更小的空间。
一、位域的使用方法
1、定义
struct 位域结构名
{ 位域列表 };
其中位域列表的形式为: 类型说明符 位域名:位域长度
例:
struct test1
{
int ia:3;
int ib:6;
}bits;
sizeof(test1) = 4, 为一个整形所占空间(操作系统为64位)
下面我通过几个例子来介绍位域的注意事项。
例1:
struct test1
{
int ia:3;
int :0;
int ib:6;
}bits;
位于变量必须储存在同一字节中,不能跨两个字节,若剩余位置不够则从下一字节开始,同样可以使用int :0;使ib从下一个int单元开始(可以使用其他整形和字符型,不能使用浮点型)
sizeof(test1) = 8
例2:
struct test2
{
char ca:3;
char :7;
char cb:6;
}bits;
sizeof(test2) =3 无名位域可用于占位。
例3:
struct test3
{
int ia :3;
long long lla :6;
}
sizeof(test3) = 16
位域要遵守字节对齐,即内存单元的首地址要能被基本类型成员的大小所整除。
二、位域的使用
与结构体相似:
struct
{
int ia:3;
int :7;
int ib:6;
}bits;
int main()
{
bits.ia = 3;
bits.ib = 11;
cout<<bits.ia;
return 0;
}
输出:3
PS:实际操作中编译器会对位域有所优化,例如:
struct test4
{
int ia:13;
int ib:6;
}bits;
ia位数大于8,不符合“一个位域必须存储在同一个字节中,不能跨两个字节”的规则,但实际却没有问题。