位段的声明和结构是类似的,有两个不同:
1、位段的成员必须是 int 、unsigned int 、或signed int以及char类型(只要是整型家族就行,一般都是相同的类型出现)
2、位段的成员名后边有一个冒号和一个数字
位段是以位(bit)位单位来定义结构体(或者联合体)中成员变量所占的空间。含有位段的结构体称为位段结构。程序如下:
那么位段的大小是如何计算的:位段a冒号后面的数字,代表所使用内存的大小。位段在空间上是按照4个字节(int)或者1个字节(char)的方式来开辟的。根据所使用的内存放入到开辟的内存中。
位段的内存分配:
位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段
位段中最大位的数目不能超过该类型所能表示的最大位数
通过调试:编译器上的内存存储是从低位到高位的方式存储
通过p寻址:0x0085fc78寻找所存的空间
内存中以16进制呈现:22 03 04 00
因此,存的时候是根据二进制进行存储: 0010 0010 0000 0011 0000 0100(位段上面限制了位数)
位段跨平台问题:
1、int 被当成有符号数还是无符号数是不确定的(第一个图)
2、位段中最大的数目不能确定,是根据编译器的位数而定
3、位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义
4、当一个结构体包含两个位段,第二个位段成员比价大,无法容纳于第一个位段剩余的位时,是舍弃剩余位还是利用,这是不确定的。
总结:跟结构体相比,位段还是很节省空间的
注意:1、int :4; 无名位段 无名位段不能被访问,但是会占空间。
2、不能对位段进行取地址操作。
3、对位段赋值时,不要超过位段所能表示的最大范围,否则造成位置的情况
4、位段不能出现数组形式