在結構體中以二進位制為單位指定成大小的方式,稱為:位段或位域。
有時資料的儲存用不了乙個或多個位元組,如表示真假時,只需要乙個位元位即可。
本質還是為了節省空間
注意:位段不跨平台
1.位段的成員必須為unsigned(無符號)或int,char型別;
2.位段的成員名後邊有乙個冒號和乙個數字(這個數字為所佔位元位大小)
3.位段按照一次4個位元組(int)或者1個位元組(char)來開闢空間
使用時應注意:
若你所分配的記憶體不夠存放你所要儲存的資料時就會發生截斷。
eg:
#include
intmain()
;struct s ret=
; ret.a=10;
printf
("%d\n"
,ret.a)
;//輸出為:2
system
("pause");
return0;
}
原因:10的二進位制為:1010,二a變數只有3個位元位,因此發生截斷。
從左向右只取了010這三位,因此輸出為2。
在vs平台下以char為例:
一次開闢乙個位元組(也就是8個位元位),若元素大小<8,則繼續放,直到放至某個元素處超過了這8個位元位,則重新開闢乙個位元組來儲存這個元素。以此類推,直至全部儲存完畢。
eg:
#include
intmain()
;printf
("%d\n"
,sizeof
(struct s));
//輸出為:3
system
("pause");
return0;
}
其排布規則如下圖所示:
計算大小時可以這樣理解:其中空白的格仔為浪費掉的空間;方格中的位表示的是位元位。
1.int位段被當作有符號還是無符號是不確定的;
2.位段中最大位的數目是不確定的(16位的機器最大為16,32位的為32,若寫成17則在16位機器下會出現問題);
3.位段中的成員在記憶體中是從左向右分配,還是從右向左的標準尚未定義;
4.當發生上圖空白格仔的情況,是捨棄還是利用還不確定。
結構體及位段
一 結構體 struct 是由一系列相同型別或不同型別的資料構成的資料集合。1.宣告乙個結構體的一般形式,如 struct student struct 結構體名 2.結構的定義 1 先宣告結構體型別在定義結構體變數 如上面已定義了乙個結構體型別變數,然後定義結構體變數。如 struct stude...
C語言結構體中的位段
c語言結構體中的位段 位段的記憶體分配 位段的成員可以是 int unsigned int signed int 或者是 char 屬於整形家族 型別 位段的空間上是按照需要以4個位元組 int 或者1個位元組 char 的方式來開闢的。位段涉及很多不確定因素,位段是不跨平台的,注重可移植的程式應該...
結構體之位域(位段)
有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾 個不同的區域,並說明每個區域的...