1、什么是位段?
位段的声明和结构体是相似的,但有两个不同:
(1)位段的成员必须是int、unsigned或signed int,当然也可以是char类型等等;
(2)位段的成员后边有一个冒号和一个数字。
比如:代码截图
S就是一个位段类型。
那么位段S的大小是多少?
这里可以明确的告诉你是8个字节,下面带你进一步了解
如:如果是int a的话,其实a在内存中是需要4个字节的,但是int a :2,其实是a在内存中只需要2个bit位
一个int占四个字节,而a在内存中占2个bit位,b占5个bit位,c占10个比特位,一共加起来占17个bit位,后面的d占30个比特位,所以不够一个整型的空间,所以系统会浪费第一次开辟下来的剩余的15个bit位,再向内存申请一个整型的空间存放d的30给bit位,同样也会浪费2个bit位的空间,所以总共加起来一共需要2个int型的空间,共8个字节。
2、位段的内存分配
(1)位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
(2)位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的
(3)位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
下面举一个例子
1,结构体成员变量先进行了初始化0,一个char在内存中占1个字节,也就是8个bit位,首先在内存中申请一个char型的空间,a和b共占了7个bit位,系统会浪费1个bit位,接着开辟一个char型的空间来存放c,c占了5个bit位,系统会浪费3个bit位,然后d又申请了一个char型的空间,d占了4个bit位,系统会浪费4个bit位的空间。所以系统一共开辟了3个char型的空间,也是3个字节。但是在内存中给我们显示的都是以16进制给我显示的,所以现实的如上图所示:绿色位赋值之后的二进制,最终显示的二进制位为,这里我用每四位2进制位放在一起的方法表示,所以连在一起为:
二进制:0110 0010 0000 0011 0000 0100
16进制:0X620304
如图在系统存放方式: