天天看點

C語言 位段的相關知識

位段的相關知識:

1. 位段被當作是有符号數,還是無符号數;

2. 位段中位的最大數目;

3. 位段中成員在記憶體中的配置設定方式(從左到右,還是從右到左);

直接貼代碼:

#include <stdio.h>

#include <string.h>

#include <malloc.h>

typedef struct pid_tag

{

unsigned refcount : 6;

unsigned inactive : 1;

unsigned reactive : 2;

} radish;

typedef struct _A

{

unsigned a:4; //位段成員的類型僅能夠為unsigned或者int

unsigned b:4;

unsigned c:2;

unsigned d:6;

unsigned E:1;

unsigned D:2;

unsigned T:3;

unsigned A:9;

unsigned h:4; //前面已經為31,故4+31>32已超過一個存儲單元,是以4在一個新的存儲單元存放

unsigned y:29; //由于前面的4在一個新的存儲單元的開頭存放,且29+4>32, 故在另一個新的存儲單元存放

}A; //是以最後求出的A的大小是4 + 4 + 4 =12

/*

對上面的具體解釋: 一個位段必須存儲在同一個存儲單元中,不能跨兩個單元.

如果某存儲單元空間中不能容納下一個位段,則改空間不用,而從下一個存儲單元起存放該位段.

結構體A中的h和y就是這種情況.在gcc環境下,測試後,一個存儲單元為4個位元組.

*/

typedef struct _S

{

unsigned a:4;

unsigned b:4;

unsigned c:22;

unsigned q:1;

unsigned h:1;

//unsigned i:33;錯誤:'i'的寬度超過它自身的類型

//unsigned i:1; 當多出此行時,該結構體大小由4變為8,因為此行之前正好為32位

} S;

typedef struct _T

{ //當沒有占滿一個存儲單元時,結構體的大小對齊為一個存儲單元的大小

unsigned a:2;

unsigned b:2;

unsigned j:1;

unsigned :1; //可以定義無名位段,此例中該無名位段占用1位的空間,該空間将不被使用

} T;

typedef struct _V

{

unsigned a:1;

unsigned b:4;

unsigned :0; //定義長度為0的位段時不能指定名字,否則編譯不過

unsigned d:1; //定義了0字段後,緊接着的下一個成員從下一個存儲單元開始存放;

}V; //此例子中,d前面那個存儲單元中的餘下的27位中被0填充了

void bit_test()

{

A a;

S s;

T t;

V v;

char ch = 0x00;

printf("Bit Struct Test:/n");

printf("sizeof(a)=%d/n", sizeof(a));

printf("sizeof(s)=%u/nsizeof(t)=%u/n", sizeof(s), sizeof(t));

printf("sizeof(v)=%d/n", sizeof(v));

((radish*)(&ch))->refcount = 0x3f;

((radish*)(&ch))->inactive = 0x1;

((radish*)(&ch))->reactive = 0x1;

// 指派以後:ch = 0xff

}