位段
位段的声明和结构体是类似的,有两个不同:
1.位段的成员必须是 char、unsigned int 或signed int 。
2.位段的成员名后边有一个冒号和一个数字。
冒号后面数字代表该成员变量占多少个比特位的数据。a使用4共 ,b使用8个,c使用31个,一共需要43个比特位,开辟两个int类型存储。C语言标准并没有规定位段内存中的使用方式,所以位段不具有跨平台性。
vs2019下的位段
a需要3个比特位,b需要4个比特位,一个字节剩下一个比特位,vs2019不会使用这个比特位,再创建一个字节的空间存储c的7个比特位。
10的二进制是1010,存储到a的内存中,a只有3个比特位,存储低位数据010,从右往左开始使用;20的二进制位10100,存储到b的内存中,b只有5个比特位,存储低位数据0100;30的二进制位是11110,存储到c的内存中,c有7个比特位,直接存储,不够的补0。
位段的内存分配
位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。例如:1.从右往左使用比特位还是从左往右使用比特位,这是不确定的。
位段的跨平台问题
int位段是有符号的还是无符号的。
不同位的机器,位段最大数不一样,32位机器下的最大值是32,64位机器下的最大值是64。
从右往左使用比特位还是从左往右使用比特位,这是不确定的。
不够空间的时候,剩余的比特位是否使用,这也是不确定的。