1樓:
1.什麼是位段
在前面各章中, 我們已經討論過位元組概念了。在大多數的計算機系統中, 乙個位元組是由八個更小的, 稱作為位的單位組成的。位是比位元組更小的單位。
位只有兩個值, 1 或 0 。因此, 儲存在計算機儲存器中的乙個位元組可以看成由八個二進位制數字形成的串。
例如, 乙個存放值 36 的位元組是八個二進位制數字的串: 可以表示成 00100100。 存入值24 的位元組可以表示成 00010100。
有時, 我們希望不僅對位元組進行操作, 也要能對位進行操作。例如, 用布林真或假條件表示的標誌, 在計算機中可用位來表示。
但是, 說明乙個用作標誌的普通變數至少要用乙個位元組---8 位, 而在某些計算機系統中則可能是 16 位。 如果我們想在乙個很大的表中儲存很多標誌, 那麼 "被浪費" 的記憶體空間是很可觀的。在 c 語言中, 一種方法是用叫做位段的構造型別來定義乙個壓縮資訊的結構。
什麼是位段呢? 位段是 c 語言特有的資料結構, 它允許我們定義乙個由位組成的段, 並可為它賦以乙個名字。
2.位段的用法
我們已經了解什麼是位段了, 現在我們繼續討論位段的使用方法。
先看乙個例子: 我們需要用到五個變數。 假定, 其中三個用作標誌, 稱為 f1, f2 和 f3。
第四個稱為 type, 取值範圍為 1 至 12。 最後乙個變數稱為 index, 值的範圍為 0 至 500。
通常, 我們用下面的語句來說明這些變數:
char f1,f2,f3;
unsigned int type;
unsigned int index;
但是, 實際上標誌 f1, f2, f3 分別只需要 1 位。變數 type 只需要 4 位, 而變數 index 只需要 9 位。 總共是 16位 ---- 2 個位元組。
我們用兩個位元組就夠了。
我們可這樣來做:
struct packed_struct
;該例中, 我們定義了乙個結構 packed_struct。該結構定義了五個成員。第乙個成員叫做 f1, 是 unsigned int 型別的。
緊跟在該成員名之後的 :1 規定了它以 1 位存放。類似地, 標誌 f2 和 f3 被定義為長度只有 1 位的。
定義成員 type 占有 4 位。定義成員 index 占有 9 位。c 編譯器自動地把上面的位段定義壓縮在一起。
位段的劃分如圖所示。packed_struct 總共使用了 16 位。
這種方法的好處是, 定義成 packed_struct 型別的變數的位段, 可以如引用一般的結構成員一樣方便地引用。同時, 使用了更少的記憶體單元數。
我們已經定義了乙個稱作為 packed_struct 的包含著位段的結構。現在, 我們象下面那樣定義乙個稱作為 packet_data 的變數: struct packed_struct packed_data; 於是, 我們就可以用簡單的語句, 把 packed_data 的 type 位段設定為 7:
packed_data.type = 7; 類似地, 我們可以用下面的語句把這個位段的值設為 n:
packed_data.type = n; 我們不必擔心 n 的值太長, 以致不能放入 type 位段中, c 編譯器會自動地僅取出 n 的低四位, 把它賦值給 packed_data.type。
取出位段的值也自動地處理的, 因此語句 n = packed_data.type; 將從 packed_data 中取出 type 位段, 並把它的值賦給 n。
在一般的表示式中可以使用位段, 此時, 位段自動地轉換成整數。因此, 表示式
i = packed_data.index/5+1; 是完全有效的。
在包含位段的結構中, 也可以包括 "通常的" 資料型別。因此, 如果我們想定義乙個結構, 它包含乙個 int, 乙個 char, 和二個 1 位的標誌, 那麼, 下面的定義是有效的:
struct table_entry
;當位段出現在結構定義中時, 它們就被壓縮成字。如果某個位段無法放入乙個字中, 那麼該字的剩餘部分跳過不用, 該位段被放入下乙個字中。
使用位段時, 必須注意下列事項:
在某些機器上, 位段總是作為 unsigned 處理, 而不管它們是否被說明成 unsigned 的。
大多數c 編譯器都不支援超過乙個字長的位段。
位段不可標明維數; 即, 不能說明位段陣列, 例如 flag:l[2]。
最後, 不可以取位段位址。原因是, 在這種情況不, 顯然沒有稱作為 "位段指標" 型別的變數。
這裡, 我們再深入討論一下位段。如果使用下面的結構定義:
struct bits
;那麼, 位段是怎樣壓縮的呢? 由於成員 word 出現於其間, 故 f1, f3 不會壓縮在同乙個字內。c 編譯器不會重新安排位段定義來試圖優化儲存空間。
可以指定無名位段, 使得乙個字中的某些位被 "跳過"。因此, 定義:
struct x_entry
;將定義乙個結構 x_entry, 它包含兩個位段變數 type 和 count, 而無名位段規定了 type 和 count 間隔三位。
2樓:
應該是表示佔1bit的意思吧!
3樓:
暈!樓上講了這麼多,我們講什麼呀?你那問題就是設定b的大小在記憶體中為1個byte
做個C語言的初級題目
1.include stdio.h int peach int d void main 2.include stdio.h void main 求算式1 1 2 1 3 1 4 1 5 1 6 直到第40項的和 include void main printf 值為 f n s int i,flag...
c語言的問題,C語言問題?
魘傳說 這個 的作用就是利用do while將陣列算出來,然後利用for迴圈遍歷,倒序輸出陣列。我感覺很奇怪,devc 出來的結果是10010。我算出來的結果應該是00010,因為強轉int型別應該是取0的,而不是取1.然後我用c 試了多個數字,發現所有的結果都是以1開頭,至於為什麼我也不知道,希望...
C語言的題目,比較初級。這C語言題目選哪個?
應該選b,這個是概念性的東西,課本上應該有。應該選擇a 因為uxb value是乙個聯合體,因此成員共用記憶體,所以只有乙個有效成員。b錯誤的原因在於sxb value是乙個變數而非結構體型別名,結構體型別名是xingbie,對於共用體也是如此。c錯誤的原因在於字元陣列並非只能記錄性別,而可以記錄其...