C語言之位域

2021-08-01 06:29:24 字數 2175 閱讀 7640

位域的定義和使用示例;

位域的儲存規則理解;

新名詞記錄

c語言中的位域,給了我們對於位元組的位進行操作。對於一些只需要1位或者幾位就能儲存的資料,就不必要去開闢更多的空間去儲存,從而避免不必要的浪費。

要學習位域,我們需要掌握位元組和位的關係,當然還有基本資料型別儲存所需要的位元組空間。

struct

;

說明:

type = 資料型別;

member_name = 位域的名稱;

width = 位域中位的數量。寬度必須小於或等於指定型別的位寬度。

下面是位域的定義和使用示例。

/**

* 有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。

* 例如在存放乙個開關量時,只有 0 和 1 兩種狀態,用 1 位二進位即可。為了節省儲存空間,並使處理簡便,

* c 語言又提供了一種資料結構,稱為"位域"或"位段"。

* 所謂"位域"是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位數。

* 每個域有乙個網域名稱,允許在程式中按網域名稱進行操作。這樣就可以把幾個不同的物件用乙個位元組的二進位制位域來表示。

* 例如:用1位來存放乙個開關變數,只有開和關兩個狀態,0和1;

* 或者,讀取外部檔案格式——可以讀取非標準的檔案格式。例如:9 位的整數。

* * struct bsdata;

* 說明:說明 data 為 bs 變數,共佔兩個位元組。其中位域 a 佔 8 位,位域 b 佔 2 位,位域 c 佔 6 位。

* 空域:用來佔位而已

* */

void weiyutest()

bit, *pbit;

bit.a = 1;

bit.b = 4;//給位域賦值(應注意賦值不能超過該位域的允許範圍)b佔3位,所以最大二進位制為111=7

//因為b只佔2位,所以即使複製為7(111),最後只會儲存兩位

//但是是低兩位還是高兩位呢?答案是底兩位

//例如我們傳入6(110),結果列印出來的是2(10),而不是3(11)

bit.c = 15;//二進位制:1111=十進位制:15

printf("列印出各個位的數值:%d, %d, %d\n", bit.a, bit.b, bit.c);

pbit = &bit;

pbit -> a=0;//直接將a數值修改為0

pbit -> b &= 3;//等價於pbit->b=pbit->b&3,b和3按位與運算

pbit -> c |= 1;//等價於pbit->c=pbit->c|1,c和1按位或運算

printf("轉換之後各個位的數值;%d, %d, %d\n", pbit->a, pbit->b, pbit->c);

}

儲存規則如下:

1) 當相鄰成員的型別相同時,如果它們的位寬之和小於型別的 sizeof 大小,那麼後面的成員緊鄰前乙個成員儲存,直到不能容納為止;如果它們的位寬之和大於型別的 sizeof 大小,那麼後面的成員將從新的儲存單元開始,其偏移量為型別大小的整數倍。

即是說,如果乙個位域的屬性,在前面乙個位域不夠儲存時,就會跳過前面屬性的大小位元組寬度,重新開始儲存。此時這個位域屬性是和前面的位域屬性位置之間是有縫隙的。

eg:

struct bs;

printf("%d\n", sizeof(struct bs));

m、n、p 的型別都是 unsigned int,sizeof 的結果為 4 個位元組(byte),也即 32 個位(bit)。m、n、p 的位寬之和為 6+12+4 = 22,小於 32,所以它們會挨著儲存,中間沒有縫隙。

如果將成員 m 的位寬改為 22,那麼輸出結果將會是 8,因為 22+12 = 34,大於 32,n 會從新的位置開始儲存,相對 m 的偏移量是 sizeof(unsigned int),也即 4 個位元組。

如果再將成員 p 的位寬也改為 22,那麼輸出結果將會是 12,三個成員都不會挨著儲存。

當乙個位域沒有名稱,只有占用位域大小時,那麼此位域不能夠訪問,如果沒有儲存,那麼也不分配空間。

位域可以很好的節省空間,也是比較難理解的乙個知識點,主要是要對基本的資料型別所需儲存大小熟悉,然後還要理解其儲存的規則,才能夠更好的理解位域。

以上知識點可能理解有誤,以及有疏漏,望請不奢賜教。謝謝。

C語言之位域的概念和用法

先來個位域申明 struct元素 描述type 整數型別,決定了如何解釋位域的值。型別可以是整型 有符號整型 無符號整型。member name 位域的名稱。width 位域中位的數量。寬度必須小於或等於指定型別的位寬度。帶有預定義寬度的變數被稱為位域。位域可以儲存多於 1 位的數,例如,需要乙個變...

C語言之位段

結構體可以用來實現位段,在c語言中多數情況下按照乙個位元組的整數倍為單位處理資料,也就是必須是以8位為單位處理資料,比如乙個char為8位,乙個int可能為32位.位段使我們可以按 任意 位處理資料,比如7位,6位等.位段的宣告如下 位段宣告 型別 識別符號 位寬表示式 struct char st...

C語言之位運算

指標和位運算很適合編寫系統軟體的需要。位運算指進行二進位制位的運算。按位與 運算子 用途 1 清零 2 取乙個數中某些指定位 比如只需要低8位 3 想保留哪一位保留下來,就與乙個數進行 運算,此數在該位取1。按位或 按位異或 xor 同0異1 1 使特定位翻轉 2 與0相異或,保留原值 3 交換兩個...