結構體中的位段

2021-10-01 04:10:17 字數 1241 閱讀 6412

在結構體中以二進位制為單位指定成大小的方式,稱為:位段或位域。

有時資料的儲存用不了乙個或多個位元組,如表示真假時,只需要乙個位元位即可。

本質還是為了節省空間

注意:位段不跨平台

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語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾 個不同的區域,並說明每個區域的...