網站首頁 語言 會計 網際網路計算機 醫學 學歷 職場 文藝體育 範文
當前位置:學識谷 > 計算機 > C語言

C語言位域的使用與注意事項解析

欄目: C語言 / 釋出於: / 人氣:1.54W
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 規則2struct testLen1{char a:5;char b:2;  char d:3;  char c:2;  char e:7;  }len1;  printf("sizeof(len1) =%dn",sizeof(len1)); //3bytes 規則1struct 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位元組}