前面我們說過了自定義型別,包含結構體,位段,列舉,聯合。前一篇我們總結了結構體,今天來說一下位段,列舉,聯合。
一、位段
1、位段概念
c語言中允許在乙個結構體中以位為單位來指定其成員所佔記憶體長度,這種以位為單元的成員稱為「位段」或「位域」。
(1)位段的成員可以是int,unsigned int,signed int,都是整形型別。
(2)位段後面有乙個冒號和乙個數字,這個數字代表位段所佔的二進位制位數。(這個數字不能超過32,因為int 開闢的是四個位元組的空間,最多只有32個 bit 位)
2、位段的儲存
首先先看變數的型別,開闢型別大小的位元組數,然後看位段後面的數字,是幾就占用幾個bit位,剩餘的bit位留給下乙個變數使用。如果空間不夠就開闢對應型別大小的位元組數。
對於位段結構,編譯器會自動進行儲存空間的優化,保持以下兩個原則。
(1)乙個位段儲存單元如果可以儲存下位段的所有成員,那麼這些成員必須要放入乙個位段儲存單元,不能放入兩個位段儲存單元。如果不可以儲存下所有成員,那麼剩餘的位段成員從下乙個儲存單元開始儲存。
(2)如果位段結構中,只有乙個占有0位的無名位段,則只佔0或1的位元組的空間。(c語言佔0位元組,c++佔1位元組),否則剩下的情況至少占用乙個位段儲存單元。(無名位段不可以被訪問,但是會佔據空間)
(3)舉個例子
struct x
a;
此例中,我們計算位段x,首先我們看型別是int,開闢的是4個位元組大小的儲存單元,a是 2 bit,b是 3 bit,c 是 5 bit,d是 6 bit,加起來一共是16 bit, 但是開闢的是4位元組的儲存空間,所以用sizeof求位段x的大小是4位元組。
二、列舉
1.列舉的概念
列舉顧名思義,就是一一枚舉,把可能的取值一一枚舉出來。例如星期,性別,月份,顏色。
enum day
;
enum 就是列舉型別,中的內容就是列舉型別的可能取值,稱為 列舉常量。這些可能取值都是有值的,預設從0開始,一次遞增1,在定義的時候也可以賦初值。在賦值的時候需要注意,可以把列舉常量賦給列舉變數,但是不可以把列舉常量的數值賦給列舉變數。比如 day 1=mon是正確的,但是day 1=1就是錯誤的。
2、列舉的優點
(1)增加**的可讀性和可維護性
(2)和#define定義的識別符號比較,列舉有型別檢查,更加嚴謹。
(3)防止了命名汙染
(4)便於除錯
(5)使用方便,一次可以定義多個常量
三、聯合
1、聯合的概念
聯合也是一種特殊的自定義型別,這種型別定義的變數也包含一系列的成員,特徵是這些成員公用同一塊空間,所以聯合也稱為共用體。
2、聯合的計算
(1)聯合的成員是共用同一塊記憶體空間的,這樣乙個聯合的大小至少是它最大成員的大小。
(2)當最大成員的大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
union un1
;union un2
;printf("%d\n",sizeof(union un1));//8
printf("%d\n",sizeof(union un2));//16
位段 列舉 聯合
2.列舉 3.聯合 1.位段的成員必須是 int,unsigned int signed 即必須是整形家族 這是因為位段的成員是以位元位為單位進行儲存的,假如是浮點型別,給成員乙個5.3的容量,0.3的位元位去 找呢?2.位段的成員名後面有乙個冒號和數字 3.具體宣告如下 1.平時我們開闢空間都是偶...
位段,列舉,聯合的講解
一 位段 位段 度娘給出的解釋是,c語言允許在乙個結構體中以位為單位來指定其成員所佔記憶體長度,這種以位為單位的成員稱為 位段 或稱 位域 bit field 利用位段能夠用較少的位數儲存資料。位段的宣告和結構體很相似,但不同的是 位段的成員可以是int,unsigned int,signed in...
位段 位段計算大小 列舉 聯合
位段 成員必須是int unsigned int 和signed int 位段的成員名後邊有乙個冒號和乙個數字。eg struct s s就是乙個位段型別 printf d n sizeof struct s 8 分析 int 型具有四個位元組,共32個位元位,故儲存時將前三個放入第一塊空間中,由於...