结构体位制与内存对齐

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   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值