一.什么是位段
在结构体中以二进制为单位指定成大小的方式,称为:位段或位域。
二.存在原因
有时数据的存储用不了一个或多个字节,如表示真假时,只需要一个比特位即可。
本质还是为了节省空间
三.使用方法
注意:位段不跨平台
1.位段的成员必须为unsigned(无符号)或int,char类型;
2.位段的成员名后边有一个冒号和一个数字(这个数字为所占比特位大小)
3.位段按照一次4个字节(int)或者1个字节(char)来开辟空间
使用时应注意:
若你所分配的内存不够存放你所要存储的数据时就会发生截断。
eg:
#include<stdio.h>
int main()
{
struct s
{
char a:3;
char b:4;
};
struct s ret={0};
ret.a=10;
printf("%d\n",ret.a);//输出为:2
system("pause");
return 0;
}
原因:10的二进制为:1010,二a变量只有3个比特位,因此发生截断。
从左向右只取了010这三位,因此输出为2。
四.在内存中存储的形式以及计算大小的方法
在VS平台下以char为例:
一次开辟一个字节(也就是8个比特位),若元素大小<8,则继续放,直到放至某个元素处超过了这8个比特位,则重新开辟一个字节来存储这个元素。以此类推,直至全部存储完毕。
eg:
#include<stdio.h>
int main()
{
struct s
{
char a:3;//a占3个比特位的大小,以下同理
char b:4;
char c:5;
char d:4;
};
printf("%d\n",sizeof(struct s));//输出为:3
system("pause");
return 0;
}
其排布规则如下图所示:
计算大小时可以这样理解:其中空白的格子为浪费掉的空间;方格中的位表示的是比特位。
五.位段跨平台问题
1.int位段被当作有符号还是无符号是不确定的;
2.位段中最大位的数目是不确定的(16位的机器最大为16,32位的为32,若写成17则在16位机器下会出现问题);
3.位段中的成员在内存中是从左向右分配,还是从右向左的标准尚未定义;
4.当发生上图空白格子的情况,是舍弃还是利用还不确定。