2.列舉
3.聯合
1.位段的成員必須是 int, unsigned int , signed 即必須是整形家族;
這是因為位段的成員是以位元位為單位進行儲存的,假如是浮點型別,給成員乙個5.3的容量,0.3的位元位去**找呢?
2.位段的成員名後面有乙個冒號和數字
3.具體宣告如下:
1.平時我們開闢空間都是偶數字元位,用來儲存奇數就會造成一定的空間浪費,當這種資料特別多的時候,浪費的空間就會非常龐大,此時我們用位段來進行儲存,就可以有效的利用空間,將奇數字段打包在一起;
2.用位段可以很方便的訪問乙個整形的部分內容
以上述定義的位段a為例
接下來一起看看在計算機中的解釋吧
由1.2可知我們知道了位段的優點,接下來介紹一下位段的缺點;
位段的可移植是非常差的,主要是由以下幾點的原因導致:
1.整形有無符號不確定,有可能你的計算機int是有符號的,其他人的計算機是無符號的;
2.平台的不同,最大位元組數可能不同,比如你的是32位計算機,別人的是16位,那麼你給乙個變數20個位元位的空間移植過去就會發生錯誤;
3.儲存的方向不同,比如你的是從左至右儲存,別人的是從右至左儲存;
4.當儲存乙個成員之後,剩餘的空間不足以容納下乙個成員,那麼下乙個成員是將剩餘的空間補滿再開闢新的空間,還是全部儲存到新的空間裡面也是不確定的;
以上四點導致了位段的可移植性非常差;
1.位段的所有型別都一樣不需要記憶體對齊;
2.位段是一種資料結構儲存的壓縮方案,只考慮空間不考慮效率
列舉的特性:
1.列舉常量的取值是從0開始的,往下依次遞增,當然我們也可以在定義的時候進行賦值;
2.列舉是一種型別,佔4個位元組;
3.列舉的運用如下圖所示:
我們知道 #define也可以定義常量,那麼為什麼要用列舉呢?這是因為它有如下幾個優點;
1.增加**的可讀性和維護性
2.#define只是進行替換而不會進行檢查,列舉有型別的檢查更加的嚴謹
3.防止了命名的汙染
4.方便除錯
5.使用方便,可以一次定義多個常量
1.聯合的成員公用一塊記憶體空間,因此聯合變數的大小最少是最大成員的大小
2.聯合需要進行記憶體對齊,對齊到最大對齊數的整數倍
3.聯合成員都是從最低處開始讀取資料
3.3.3記憶體對齊證明
位段,列舉,聯合
前面我們說過了自定義型別,包含結構體,位段,列舉,聯合。前一篇我們總結了結構體,今天來說一下位段,列舉,聯合。一 位段 1 位段概念 c語言中允許在乙個結構體中以位為單位來指定其成員所佔記憶體長度,這種以位為單元的成員稱為 位段 或 位域 1 位段的成員可以是int,unsigned int,sig...
位段,列舉,聯合的講解
一 位段 位段 度娘給出的解釋是,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個位元位,故儲存時將前三個放入第一塊空間中,由於...