結構體 位段

2021-07-25 08:29:55 字數 928 閱讀 2336

每天進步一點點!

編譯器會盡可能的避免儲存空間的浪費,這個特性在結構體中顯得尤為重要。

我們知道在結構體中為了提公升效率和避免儲存空間的浪費,在儲存其成員時要進行記憶體對齊,但是除了這個做法之外,這裡還有乙個更加節省空間的做法,那就是 實現位段能力。

在c語言中允許我們定義的最小資料型別是佔乙個位元組(8bit)的char,它可以表示2^8個數字,但是有時候我們只需要幾個bit位就可以表示乙個資料,比如我們要表示性別(兩種)的話只需要乙個bit位(兩種狀態),比如我們要表示乙個佔17個bit位的資料的話就沒必要去給它分配32 個bit位,位段允許我們實現如上的功能,它的具體用法如下。

struct a

obj1;

在成員名後面跟乙個冒號和乙個數字,數字表示它所佔bit位的大小,比如上面***佔乙個bit位,足以表示性別的兩種狀態,font佔17個bit位,這樣我們就不必為他開闢乙個32個bit位大小的空間了,所以上面這個結構體占20個bit位,但是考慮到結構體對齊問題,實際上計算機給它分配了32個bit位(4位元組)。

規則:1、在遇到不同型別或非位段資料時將給它重新分配空間。

2、位段是結構體的一種能力,所以使用它時也符合結構體對齊規則。

注意:1、當後面的位段較大,無法儲存於前乙個位段剩餘的空間時,究竟是給它重新分配空間還是直接放在前乙個位段的後面,這取決於你的機器。

2、位段中的資料是

從右向左還是從左向右分配的也與機器有關。

3、位段的最大長度由編譯器決定,大多數編譯器把位段的最大長度限定在乙個整型長度之內,所以乙個能夠執行與32位整數的機器上的位段不一定能在16位機器上執行。

4、注重可移植性的程式應該避免使用位段,因為位段使用的某些規則與機器和編譯器密切相關,如果使用了,那麼當程式在另一台機器上執行時可能會發生不可預料的錯誤。

成於堅持,敗於止步!

結構體 位段

在前面各章中,我們已經討論過位元組概念了。在大多數的計算機系統中,乙個位元組是由八個更小的,稱作為位的單位組成的。位是比位元組更小的單位。位只有兩個值,1 或 0 因此,儲存在計算機儲存器中的乙個位元組可以看成由八個二進位制數字形成的串。例如,乙個存放值 36 的位元組是八個二進位制數字的串 可以表...

C語言結構體,位段

1.結構的定義 在實際情況中,資料經常以成組的形式存在。如果這些值的型別各不相同,他們無法同時儲存於同乙個陣列中,在c中,可以使用結構把不同型別的值儲存在一起,所以結構也是一些值的集合,這些值稱為它的成員,但是這些成員的型別可以不同。拓展 結構 是一種構造資料型別,也叫做使用者自定義資料型別,它是由...

結構體,位段,列舉,聯合

結構體是一種可以將不同型別打包在一起的一種使用者自定義型別。描述乙個學生 struct student stu 這裡的定義及使用要遵循以下原則 第乙個 第二次定義變數時 時可採用以下形式進行二次定義 struct student a 第二個 也可用以下形式定義 typedef struct stud...