所謂“位域”是把一個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位數。每個域有一個域名,允許在程式中按域名進行操作。這樣就可以把幾個不同的物件用一個位元組的二進位制位域來表示。位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:
struct 位域結構名
{ 位域列表 };
eg:
1 2 3 4 5 6 |
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跟編譯器有較大的關係,使用時要慎重,儘量避免。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#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位元組 } |