Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158250
  • 博文数量: 50
  • 博客积分: 83
  • 博客等级: 民兵
  • 技术积分: 297
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-12 11:47
文章分类
文章存档

2012年(43)

2011年(7)

分类:

2011-12-13 11:37:48

原文地址:C位段 作者:any_wind

  1. C语言: C中的位段的使用
  2. /*
  3.         DATE : 2010.6.24
  4.         关于C中的位端igned或者int
  5. */
  6. #include <stdio.h>

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

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

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

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

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


  48. int main()
  49. {
  50.         A a; S s; T t; V v;
  51.         printf("sizeof(a)=%d\n", sizeof(a));
  52.         printf("sizeof(s)=%u\nsizeof(t)=%u\n", sizeof(s), sizeof(t));
  53.         printf("sizeof(v)=%d\n", sizeof(v));
  54.         return 0;
  55. }


阅读(800) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~