C结构体中位段的使用

 
  1. #include <stdio.h>
  2. typedef struct _A
  3. {
  4. unsigned a:4; //位段成员的类型仅能够为unsigned或者int
  5. unsigned b:4;
  6. unsigned c:2;
  7. unsigned d:6;
  8. unsigned E:1;
  9. unsigned D:2;
  10. unsigned T:3;
  11. unsigned A:9;
  12. unsigned h:4; //前面已经为31,故4+31>32已超过一个存储单元,所以4在一个新的存储单元存放
  13. unsigned y:29; //由于前面的4在一个新的存储单元的开头存放,且29+4>32, 故在另一个新的存储单元存放
  14. }A; //所以最后求出的A的大小是4 + 4 + 4 =12
  15. /*对上面的具体解释: 一个位段必须存储在同一个存储单元中,不能跨两个单元.如果某存储单元空间中不能容纳下一个位段,则改空间不用,而从下一个存储单元起存放该位段. 结构体A中的h和y就是这种情况.在gcc环境下,测试后,一个存储单元为4个字节.
  16. */
  17. typedef struct _S
  18. {
  19. unsigned a:4;
  20. unsigned b:4;
  21. unsigned c:22;
  22. unsigned q:1;
  23. unsigned h:1;
  24. //unsigned i:33; // 错误:‘i’ 的宽度超过它自身的类型
  25. unsigned i:1; //当多出此行时,该结构体大小由4变为8,因为此行之前正好为32位
  26. } S;
  27. typedef struct _T
  28. { //当没有占满一个存储单元时,结构体的大小对齐为一个存储单元的大小
  29. unsigned a:2;
  30. unsigned b:2;
  31. unsigned j:1;
  32. unsigned : 1;//可以定义无名位段,此例中该无名位段占用1位的空间,该空间将不被使用
  33. }T;
  34. typedef struct _V
  35. {
  36. unsigned a:1;
  37. unsigned b:4;
  38. unsigned :0; //定义长度为0的位段时不能指定名字,否则编译不过
  39. unsigned d:1; //定义了0字段后,紧接着的下一个成员从下一个存储单元开始存放;
  40. }V; //此例子中,d前面那个存储单元中的余下的27位中被0填充了
  41. int main()
  42. {
  43. A a;
  44. S s;
  45. T t;
  46. V v;
  47. printf("sizeof(a)=%d\n", sizeof(a));
  48. printf("sizeof(s)=%d\n", sizeof(s));
  49. printf("sizeof(t)=%d\n", sizeof(t));
  50. printf("sizeof(v)=%d\n", sizeof(v));
  51. return 0;
  52. }
#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 t;
		 V v;
         printf("sizeof(a)=%d\n", sizeof(a));
         printf("sizeof(s)=%d\n", sizeof(s));
		 printf("sizeof(t)=%d\n", sizeof(t));
         printf("sizeof(v)=%d\n", sizeof(v));
         return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值