結構體中的冒號

題目:

 struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
}
sizeof(A)=?(不考慮邊界對齊)

7,如果考慮邊界對其,則爲8

 

以下段落引用來源:http://daixinghe.blog.163.com/blog/static/18436159201062111032307/

有些信息在存儲時,並不需要佔用一個完整的字節, 而只需佔幾個或一個二進制位。例如在存放一個開關量時,只有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變量,共佔兩個字節。其中位域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 /*該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.

發佈了27 篇原創文章 · 獲贊 21 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章