轉自:http://blog.chinaunix.net/u/17030/showart_101273.html
一、概念
位結構是一種特殊的結構, 在需按位訪問一個字節或字的多個位時, 位結構比按位運算符更加方便。
位結構定義的一般形式爲:
struct位結構名{
數據類型 變量名: 整型常數;
數據類型 變量名: 整型常數;
} 位結構變量;
其中:
數據類型必須是int(unsigned或signed)。 整型常數必須是非負的整數, 範圍是0~32, 表示二進制位的個數, 即表示有多少位。
變量名是選擇項, 可以不命名, 這樣規定是爲了排列需要。
例如: 下面定義了一個位結構。
struct{
unsigned incon: 8; /*incon佔用低字節的0~7共8位*/
unsigned txcolor: 4;/*txcolor佔用高字節的0~3位共4位*/
unsigned bgcolor: 3;/*bgcolor佔用高字節的4~6位共3位*/
unsigned blink: 1; /*blink佔用高字節的第7位*/
}ch;
位結構成員的訪問與結構成員的訪問相同。
例如: 訪問上例位結構中的bgcolor成員可寫成:
ch.bgcolor
二、注意事項
1. 位結構中的成員可以定義爲unsigned, 也可定義爲signed, 但當成員長度爲1時, 會被認爲是unsigned類型。因爲單個位不可能具有符號。
2. 位結構中的成員不能使用數組和指針, 但位結構變量可以是數組和指針,如果是指針, 其成員訪問方式同結構指針。
3. 位結構總長度(位數), 是各個位成員定義的位數之和, 可以超過兩個字節。
4. 位結構成員可以與其它結構成員一起使用。
例如:
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned state: 1;
unsigned pay: 1;
}workers;
上例的結構定義了關於一個工人的信息。其中有兩個位結構成員, 每個位結構成員只有一位, 因此只佔一個字節但保存了兩個信息, 該字節中第一位表示工人的狀態, 第二位表示工資是否已發放。由此可見使用位結構可以節省存貯空間。