詳解C言語位域的運用與留意事項。本站提示廣大學習愛好者:(詳解C言語位域的運用與留意事項)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C言語位域的運用與留意事項正文
位域的定義
有些信息在存儲時,並不需求占用一個完好的字節, 而只需占幾個或一個二進制位。例如在寄存一個開關量時,只要0和1 兩種形態, 用一位二進位即可。為了節省存儲空間,並使處置簡便,C言語又提供了一種數據構造,稱為“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分為幾個不同的區域,並闡明每個區域的位數。每個域有一個域名,允許在順序中按域名停止操作。 這樣就可以把幾 個不同的對象用一個字節的二進制位域來表示。
位域的定義和位域變量的闡明位域定義與構造定義相仿,其方式為:
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字節 }
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家學習或許運用C言語能帶來一定的協助,假如有疑問大家可以留言交流。