在定義結構體的時候,我們在指定成員變量的類型的同時也可以指定成員變量所佔的位數,其定義形式爲:
struct teststruct
{
類型1 成員1 :成員1所佔位數;
類型2 成員2 :成員2所佔位數;
類型3 成員3 :成員3所佔位數;
......
};
雖然拆分基本成員變量在語法上是得到支持的,但是並不等於我們想怎麼分就怎麼分,例如下面的拆分顯然是不合理的:
struct student
{
unsigned short sex : 1;
unsigned short age : 12;
};
這是因爲 1+12 = 13(但是這個結構所佔的空間很可能是2個字節而不是13位),不能再組合成一個基本成員,不能組合成 char、int 或任何類型, 拆分的位數應該是合乎邏輯的,應仍然可以組合爲基本成員變量 (這個和編譯器的字節對齊屬性有關)。測試代碼:
#include <stdio.h>
typedef struct teststruct
{
unsigned int val1 : 1;
unsigned int val2 : 2;
unsigned int val3 : 29;
}TS;
int main()
{
TS tmp;
printf("size of TS: %d\n",sizeof(tmp));
printf("size of unsigned int: %d\n",sizeof(unsigned int));
tmp.val1 = 2;
tmp.val2 = 5;
tmp.val3 = 999;
printf("val1:%d,val2:%d,val3:%d\n",tmp.val1,tmp.val2,tmp.val3);
system("pause");
return 0;
}
輸出:
size of TS: 4
size of unsigned int: 4
val1:0,val2:1,val3:999
val1只佔一位,2的二進制爲10,故而val1的值爲0,val2同理。
參考:http://www.cnblogs.com/mashang/archive/2011/03/24/1993513.html