C中的位段的使用

C语言:  C中的位段的使用
/*
        DATE : 2010.6.24
        关于C中的位端igned或者int
*/

#include <stdio.h>

typedef struct  _A
{
         unsigned  a : 4; //位段成员的类型仅能够为unsigned或者int
         unsigned b : 4;
         unsigned  c : 2;
         unsigned  d : 6;
         unsigned  E : 1;
         unsigned  D : 2;
         unsigned  T : 3;
         unsigned  A : 9;
         unsigned  h : 4//前面已经为31,故4+31>32已超过一个存储单元,所以4在一个新的存储单元存放
         unsigned  y : 29; //由于前面的4在一个新的存储单元的开头存放,且29+4>32, 故在另一个新的存储单元存放
} A;                //所以最后求出的A的大小是4 + 4 + 4 =12

/*对上面的具体解释: 一个位段必须存储在同一个存储单元中,不能跨两个单元.如果某存储单元空间中不能容纳
                                    下一个位段,则改空间不用,而从下一个存储单元起存放该位段. 结构体A中的h和y就是这种情况.
                                        在gcc环境下,测试后,一个存储单元为4个字节.
*/


typedef struct  _S
{
         unsigned  a : 4;
         unsigned b : 4;
         unsigned  c : 22;
         unsigned  q : 1;
         unsigned  h : 1;
         //unsigned i:33;  // 错误:‘i’ 的宽度超过它自身的类型
        //unsigned i:1;当多出此行时,该结构体大小由4变为8,因为此行之前正好为32位

} S;

typedef struct  _T
{        //当没有占满一个存储单元时,结构体的大小对齐为一个存储单元的大小
         unsigned  a : 2;
         unsigned b : 2;
         unsigned  j : 1;
         unsigned  :  1; //可以定义无名位段,此例中该无名位段占用1位的空间,该空间将不被使用
}  T;

typedef struct  _V
{
         unsigned  a : 1;
         unsigned b : 4;
         unsigned  : 0;     //定义长度为0的位段时不能指定名字,否则编译不过
         unsigned  d : 1;    //定义了0字段后,紧接着的下一个成员从下一个存储单元开始存放;
} V;                                      //此例子中,d前面那个存储单元中的余下的27位中被0填充了


int  main()
{
         A  a; S s;  T  tV  v;
         printf( "sizeof(a)=%d \n " ,  sizeof( a));
         printf( "sizeof(s)=%u \n sizeof(t)=%u \n " ,  sizeof(s ),  sizeof( t));
         printf( "sizeof(v)=%d \n " ,  sizeof( v));
         return  0;
}

你可能感兴趣的:(c,Date,测试,gcc,存储,语言)