所謂“位域”是把一個位元組中的二進位劃分為幾個不同的地區,
並說明每個地區的位元。每個域有一個網域名稱,允許在程式中按網域名稱進行操作。
這樣就可以把幾個不同的對象用一個位元組的二進位位域來表示。位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:
struct 位域結構名
{
位域列表 };
eg:struct weiyu {
int a:2;
int b:5;
int :5;//此五位為空白域,不能使用
int c:3;
}
位域雖然簡單好用,但使用時需要注意:
1) 如果相鄰位域欄位的類型相同,且其位寬之和小於類型的sizeof大小,則後面的字
段將緊鄰前一個欄位儲存,直到不能容納為止;
2) 如果相鄰位域欄位的類型相同,但其位寬之和大於類型的sizeof大小,則後面的字
段將從新的儲存單元開始,其位移量為其類型大小的整數倍;
3) 整個結構體的總大小為最寬基本類型成員大小的整數倍。
4) 如果相鄰的位域欄位的類型不同,則各編譯器的具體實現有差異,VC6採取不壓縮方
式,Dev-C++採取壓縮方式;
5) 如果位域欄位之間穿插著非位域欄位,則不進行壓縮;(不針對所有的編譯器)
4 ,5跟編譯器有較大的關係,使用時要謹慎,盡量避免。
#include "stdio.h"
void main(int argn ,char *argv)
{
struct
test {
unsigned a:10;
unsigned b:10;
unsigned c:6;
unsigned :2;//this two bytes can't use
unsigned d:4;
}data,*pData;
data.a=0x177;
data.b=0x111;
data.c=0x7;
data.d=0x8;
pData=&data;
printf("data.a=%x data.b= %x data.c=%x data.d=%xn",pData->a,pData->b,pData->c,pData->d);//位域可以使用指標
printf("sizeof(data)=%dn",sizeof(data));
//4 bytes ,最常用的情況
struct testLen{
char a:5;
char b:5;
char c:5;
char d:5;
char e:5;
}len;
printf("sizeof(len)=%dn",sizeof(len));
//5bytes 規則2
struct testLen1{
char a:5;
char b:2;
char d:3;
char c:2;
char e:7;
}len1;
printf("sizeof(len1) =%dn",sizeof(len1));
//3bytes 規則1
struct testLen2{
char a:2;
char :3;
char b:7;
long d:20; //4bytes
char e:4;
}len2;
printf("sizeof(len2)=%dn",sizeof(len2));
//12 規則3,4,5,總長為4的整數倍,2+3
佔1byte,b佔1bye
由於與long對其,2+3+7
佔4位元組,後面 d
與 e進行了最佳化
佔一個4位元組
struct testLen3{
char a:2;
char :3;
char b:7;
long d:30;
char e:4;
}len3;
printf("sizeof(len3)=%dn",sizeof(len3));//12
規則3,4,5,總長為4的整數倍,2+3
佔1byte,b佔1bye
由於與long對其,2+3+7
佔4位元組,後面 d佔一個4位元組,為了保證與long對其e獨佔一個4位元組
}