1.0位段介绍:
- 位段 位--二进制位
- 位段的声明与结构是类似的,但是有两个不同:位段的成员必须是:int 、unsigned int、signed int ;位段成员名后面必须有一个冒号和一个数字。
- 位段作用:可以很大程度上节省空间
计算位段所占用的空间:
struct S
{
int a:2;
int b:5;
int c:10;
int d:30;
};
#include<stdio.h>
int main()
{
struct S s;
printf("%d\n",sizeof(s));
}
经运算之后得出该结果为:8
但是为什么结果是8呢??
我们要明白位段成员名冒号后面的数字代表的是:位(bit) 一共47bit--6个字节*8=48个bit
但是为什么结果是8而不是6呢??
这就涉及到位段内存分配和空间开辟的问题了
//举个例子
struct S
{
char a:3;
char b:4;
char c:5;
char d:4;
};
int main()
{
struct S s={0};
s.a=10;
s.b=12;
s.c=3;
s.d=4;
printf("%d ",sizeof(s));
}
空间开辟如下:
解释:
- 首先char类型占一个字节,所以机器会先开辟8个位的空间,从右向左依次占取,a和b一共占7个bit位,所以还多出来一个位。
- c占五个bit,所以上个多出的一个bit会被丢弃,重新再开辟出一个字节,从右向左依次占用,d占4个bit位,所以又要开辟第三个字节,从右向左依次占用。
- 将10,12,3,4四个数转换成为二进制然后依次放进自己开辟的bit位中。比如:10-->1010 但是a只占3个字节所以从右向左一次放进去,最左边的1会被舍弃。
- 最后:内存在机器中是以16进制的形式存放的,四个二进制位表示一个16进制,从左向右每四个代表一个16进制位,依次是62 03 04
2.0位段的应用
3.0位段的跨平台问题
- int 位段被当成有符号数还是无符号数是不确定的。
- 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机 器会出问题。)
- 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
- 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的。