天天看点

位段的示例!

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

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

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

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

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

C语言: C中的位段的使用 01

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

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 }

继续阅读