C語言中結構體的位域(bit-fields)


轉自:http://blog.sina.com.cn/s/blog_6240b5980100tcba.html

 

有些信息在存儲時,並不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為“位域”或“位段”。所謂“位域”把一個字節中的二進位划分為幾個不同的區域,並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。

 

一、位域的定義和位域變量的說明位域定義與結構定義相仿,其形式為: 
struct 位域結構名 
{ 位域列表 }; 
其中位域列表的形式為: 類型說明符 位域名:位域長度 


例如: 
struct bs 

int a:8; 
int b:2; 
int c:6; 
}; 
位域變量的說明與結構變量說明的方式相同。 可采用先定義后說明,同時定義說明或者直接說明這三種方式。例如: 
struct bs 

int a:8; 
int b:2; 
int c:6; 
}data; 
說明data為bs變量,共占兩個字節(這里假定int類型長度為16位,通常int都是32位)。其中位域a占8位,位域b占2位,位域c占6位。

 

對於位域的定義尚有以下幾點說明: 
1. 一個位域必須存儲在同一個單元中,不能跨兩個單元。如一個單元所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如: 
struct bs 

unsigned a:4 
unsigned :0  
unsigned b:4  
unsigned c:4 

這個位域定義中,a占第一字節的4位,后4位填0表示不使用,b從第二字節開始,占用4位,c占用4位。 
2. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如: 
struct k 

int a:1 
int :2  
int b:3 
int c:2 
}; 


從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。
簡而言之,言而簡之
這是位域操作的表示方法,也就是說后面加上“:1”的意思是這個成員的大小占所定義類型的1 bit,“:2”占2 bit,依次類推。當然大小不能超過所定義類型包含的總bit數。 
一個bytes(字節)是8 bit(bit)。例如你的結構中定義的類型是u_char,一個字節,共8bit,最大就不能超過8。 
32位機下, 
short是2字節,共16bit,最大就不能超過16. 
int是4字節,共32bit,最大就不能超過32. 
依次類推。 
這樣定義比較省空間。例如你上面的結構,定義的變量類型是u_char,是一字節類型,即8bit。 
fc_subtype占了4bit,fc_type占2bit,fc_protocol_version占2bit,共8bit,正好是一個字節。 
其他八個成員,各占1bit,共8bit,正好也是一個字節。 
因此你的結構的大小如果用sizeof(struct frame_control)計算,就是2bytes.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM