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 }
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 }