C語言位域 精妙使用記憶體

2022-02-06 09:05:33 字數 1778 閱讀 7474

參考鏈結   

我們都知道資訊的訪問在高階語言中最小是byte,以位元組為單位的,雖然c語言提供了位操作符&,|,~,<>可以對乙個整數進行位操作,但是並沒有對記憶體進行優化。現實生活中我們常常需要乙個標誌值或者假,即可以用二進位制0或者1表示,這種情況很常見,如開關,過程控制、引數檢測或資料通訊領域時,控制資訊往往只佔乙個位元組中的乙個或幾個二進位制位,基於此,c語言支援位域定義可以幫我們解決這個問題。

c語言允許在結構體(聯合體)中以位為單位來指定其成員變數所佔的記憶體單元,這種以位為單位的成員稱為「位段」或稱「位域」( bit field) 。利用位段能夠用較少的位數儲存資料。位段(bit-field)是以位為單位來定義結構體(或聯合體)中的成員變數所佔的空間。含有位段的結構體(聯合體)稱為位段結構。採用位段結構既能夠節省空間,又方便於操作。

定義:位域定義與結構定義相仿,其形式為:

struct 位域結構名

;其中位域列表的形式為: 型別說明符 位網域名稱:位域長度

type [var]:digits

其中,type只能為int,unsigned int,signed int三種型別(int型能不能表示負數視編譯器而定,比如vc中int就預設是signed int,能夠表示負數)。位段名稱var是可選引數,即可以省略。digits表示該位段所佔的二進位制位數。

使用位段需注意一下幾點:

1)位段的型別只能是int,unsigned int,signed int三種型別,不能是char型或者浮點型;

2)位段佔的二進位制位數不能超過該基本型別所能表示的最大位數,比如在vc中int是佔4個位元組,那麼最多只能是32位;

3)無名位段不能被訪問,但是會佔據空間;

4)不能對位段進行取位址操作;

5)若位段佔的二進位制位數為0,則這個位段必須是無名位段,下乙個位段從下乙個位段儲存單元(這裡的位段儲存單元經測試在vc環境下       是4個位元組)開始存放;

6)若位段出現在表示式中,則會自動進行整型公升級,自動轉換為int型或者unsigned int。

7)對位段賦值時,最好不要超過位段所能表示的最大範圍,否則可能會造成意想不到的結果。

8)位段不能出現陣列的形式。

二位段結構在記憶體中的儲存方式

對於位段結構,編譯器會自動進行儲存空間的優化,主要有這幾條原則:

1)如果乙個位段儲存單元能夠儲存得下位段結構中的所有成員,那麼位段結構中的所有成員只能放在乙個位段儲存單元中,不能放在兩個位段儲存單元中;如果乙個位段儲存單元不能容納下位段結構中的所有成員,那麼從剩餘的位段從下乙個位段儲存單元開始存放。(在vc中位段儲存單元的大小是4位元組).

2)如果乙個位段結構中只有乙個占有0位的無名位段,則只佔1或0位元組的空間(c語言中是佔0位元組,而c++中佔1位元組);否則其他任何情況下,乙個位段結構所佔的空間至少是乙個位段儲存單元的大小;

下面以具體例子來講解:

#include #include using namespace std;

typedef structs;

typedef struct ss;

typedef struct s1;

typedef struct s2;

typedef struct s3;

typedef struct s4;

extern int testbit()

{ s4 s4;

s4.a=1;

s4.b='a';

s4.c=1;

s4.d=2;

s4.e=2;

cout<

以下鏈結是乙個不錯的練習體

C語言位域

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存 放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位...

C語言位域

1.乙個位域必須儲存在同乙個位元組中,不能跨兩個位元組。如乙個位元組所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如 struct bs 在這個位域定義中,a佔第一位元組的 2位,後6位填 0表示不使用,c 從第二位元組開始,占用1位 2.由於位域不允許跨...

C語言 位域

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾 個不同的區域,並說明每個區域的...