位域之我見(原創)

2021-04-12 19:40:05 字數 1662 閱讀 9957

位域是個好東西,我認為它的功能主要是節省記憶體空間,但給定址帶來極大的不便,估計會導致速度變慢,所以可能有的cpu會禁止此功能或者說強制以位元組對齊之類的。可能某些編譯器的編譯選項也可以幫助位址對齊,但乙個比較簡單的方法是用」廢位「來填充不用的位來對齊。

/*測試位域的使用存放和使用

*/struct bs

data1;

data1.a = 0;

data1.b = 0;

//1data1.a = 15;

data1.b = 55;

data1.a = 254;

data1.b = 0;

這個程式經過測試,經過觀察,在x86,xp,vc6環境下,比如說a的位址為0x10000000(按位元組定址),那麼a存放在0x10000000的低4個位,b存放在高4個位,外加0x10000001的最低3個位。

當執行到1處時,0x10000000為 00 0x10000001處為c8 (記憶體被初始化為cc) ,符合。

最後我們使用了乙個254這顯然超出了a的表示,a的最大值為15,這個時候會影響到b麼?經過測試不會影響到b,自動擷取了a的超出部分,扔掉不管了,而留下了254的低4位,為14,賦值給了a,所以a的值最終為14,b未受a的影響。

還有乙個問題:b的值是怎麼表示的?

用55來舉個例子:

55-->0110111 於是0x10000001的低三位為011(55的高3位,0為該位元組的位5,從0算起),0x10000000的高4位為0111(0為該位元組的最高位),唉,應該畫個圖,可是不知道用啥畫好?不知道visio好不好呢。

位域的問題我不是第一次遇到,總之在底層程式中,驅動等和晶元相關的情況會遇到,***編譯碼估計也會遇到。

一、位域

有些資訊在儲存時,並不需要占用乙個完整的位元組, 而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為「位域」或「位段」。所謂「位域」是把乙個位元組中的二進位劃分為幾 個不同的區域, 並說明每個區域的位數。每個域有乙個網域名稱,允許在程式中按網域名稱進行操作。 這樣就可以把幾個不同的物件用乙個位元組的二進位制位域來表示。一、位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:

struct 位域結構名

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

例如:

struct bs;

位域變數的說明與結構變數說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:

struct bs

data;

說明data為bs變數,共佔兩個位元組。其中位域a佔8位,位域b佔2位,位域c佔6位。對於位域的定義尚有以下幾點說明:

struct bs

在這個位域定義中,a佔第一位元組的4位,後4位填0表示不使用,b從第二位元組開始,占用4位,c占用4位。

2. 由於位域不允許跨兩個位元組,因此位域的長度不能大於乙個位元組的長度,也就是說不能超過8位二進位。

3. 位域可以無位網域名稱,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:

struct k;

從以上分析可以看出,位域在本質上就是一種結構型別, 不過其成員是按二進位分配的。

經過我的測試,並非是」乙個位域必須儲存在同乙個位元組中,不能跨兩個位元組。「還要具體問題具體分析。

位域之我見

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

C語言位域 位段

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如開關只有通電和斷電兩種狀態,用0和1表示足以,也就是用乙個二進位。所以c語言又提供了一種資料結構,稱為位域或 位段。位域在應用開發中較少使用,你可以暫時跳過,遇到相關問題再回來溫習。所謂 位域 是把乙個位元組中的二進位...

C語言位域 位段

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如開關只有通電和斷電兩種狀態,用0和1表示足以,也就是用乙個二進位。所以c語言又提供了一種資料結構,稱為位域或位段。位域在應用開發中較少使用,你可以暫時跳過,遇到相關問題再回來溫習。所謂 位域 是把乙個位元組中的二進位劃...