3 回答

TA貢獻1900條經驗 獲得超5個贊
冒號是占位符。
有些信息在存儲時,并不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有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位。
對于位域的定義尚有以下幾點說明:
一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所??臻g不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。
例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開始存放*/
unsigned c:4
}
在這個位域定義中,a占第一字節的4位,后4位填0表示不使用,b從第二字節開始,占用4位,c占用4位。
位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。
例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。
又:
1:指針類型變量不能指定所占的位數
2. 在聲明成員變量時,可以用 變量名 :bit數;
來確定結構體類型的成員變量的值所占的字位數,如果在實際應用中,該變量的值超出了在聲明它時所聲明的字位數,那么溢出的部分將會丟失。

TA貢獻1773條經驗 獲得超3個贊
這個是struct的一個性質。
就是在結構體中指明,變量所占的位數。
因為unsigned short i;正常在32位機器中,是占16位的。
而由于程序中結構體,不需要那么多位,程序員,認為8位就足夠了,為了節省內存空間,所以它特別指出,這個變量占8位。
unsigned short i:8;
不考慮邊界對齊的話,就是想加可以,但是實際程序中,是有邊界對齊的。
就是1+1+4=6.字節。
注意上面的是以位為單位。
char t:4;
char k:4;
unsigned short i:8;
其中4,4,8指的是位。而sizeof求的是字節。
不知道說清楚沒。
- 3 回答
- 0 關注
- 162 瀏覽
添加回答
舉報