位段的示例!

1、它能把长度为奇数的数据包装在一起,从而节省存储的空间;

2、它可以很方便地访问一个整型值的部分内容。 

3、位段成员只有三种类型:int ,unsigned int

4、许多编译器把位段成员的字长限制在一个int的长度范围之内;

5、位段成员在内存的实现是从左到右还是从右到左是由编译器来决定的,但二者皆对。

01 /*
02         DATE : 2010.6.24
03         关于C中的位端igned或者int
04 */
05 #include <stdio.h>
06
07 typedef struct _A
08 {
09         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就是这种情况. 在gcc环境下,测试后,一个存储单元为4个字节.
24 */
25
26 typedef struct _S
27 {
28         unsigned a : 4;
29         unsigned b : 4;
30         unsigned c : 22;
31         unsigned q : 1;
32         unsigned h : 1;
33         //unsigned i:33; // 错误:‘i’ 的宽度超过它自身的类型
34         //unsigned i:1;当多出此行时,该结构体大小由4变为8,因为此行之前正好为32位
35 } S;
36
37 typedef struct _T
38 {       //当没有占满一个存储单元时,结构体的大小对齐为一个存储单元的大小
39         unsigned a : 2;
40         unsigned b : 2;
41         unsigned j : 1;
42         unsigned : 1; //可以定义无名位段,此例中该无名位段占用1位的空间,该空间将不被使用
43 } T;
44
45 typedef struct _V
46 {
47         unsigned a : 1;
48         unsigned b : 4;
49         unsigned : 0;    //定义长度为0的位段时不能指定名字,否则编译不过
50         unsigned d : 1;   //定义了0字段后,紧接着的下一个成员从下一个存储单元开始存放;
51 } V;                                     //此例子中,d前面那个存储单元中的余下的27位中被0填充了
52
53
54 int main()
55 {
56         A a; S s; T t; V v;
57         printf( "sizeof(a)=%d /n " , sizeof( a));
58         printf( "sizeof(s)=%u /n sizeof(t)=%u /n " , sizeof(s ), sizeof( t));
59         printf( "sizeof(v)=%d /n " , sizeof( v));
60         return 0;
61 }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值