天天看点

c语言:位段

 位段

常见于网络底层编程

位段的声明和结构体是类似的

和结构体的不同:

         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编译器下的位段大小计算

位段的意义:节省空间

位段的应用:数据传输

c语言:位段

继续阅读