位段
常见于网络底层编程
位段的声明和结构体是类似的
和结构体的不同:
1.位段的成员必须是整形,通常是一样的
2.类型 成员名:数字
位段的定义:
//位-二进制位
struct A {
int a : 2;//a只需要两个比特位
int b : 5;//b只需要五个比特位
int c : 10;
int d : 30;
};
位段的大小(vs编译器):
int main() {
struct A ss;
print("%d\n",sizeof(ss));//8
}
首先声明一个int的空间——4个字节、32个bit位。将a写入前两个bit位,将b写入3-7个bit位,将c写入8-17个bit位。
这时只这个空间剩余不足与写入30个bit位大小的d,舍弃剩余空间,开辟一个新的int大小的空间,写入d,剩余两个bit位舍弃。
所以ss大小为8。
注意:int为32bit位大小,成员大小不能大于32,否则会报错。
位段的内存分配:
1.位段的成员可以是整形家族任意类型。包括char
2.位段的空间上是按照4个字节(int)和1个字节(char)的方式开辟的。
3.位段是不能跨平台的。不可移植。
问题在于c语言官方没有定义一些位段的问题,是各个编译器按照自己的理解实现的,如:
int被当做有符号数还是无符号数是不确定的。
int中最大位数不确定,如果是16位的机器,int最高位应该是16.
位段成员从左往右还是从右往左并未有官方标准。
当位段的一个成员大于当前空间剩余bit位,剩下的bit位是舍弃还是利用,不同的编译器是不一样的。上面举的例子为VS编译器下的位段大小计算
位段的意义:节省空间
位段的应用:数据传输