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位段的应用

位段的介绍与使用_16进制_02

3.0位段的跨平台问题

  1. int 位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机 器会出问题。)
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的。