天天看點

位段的示例!

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 }

繼續閱讀