C語言 位域

2021-09-18 03:19:22 字數 1570 閱讀 7732

位域:在結構體定義時,我們可以指定某個成員所占用的二進位制位數(bit),這就是位域。

使用位域的原因:有些資料在儲存的時候並不需要占有完整的位元組,只需要占用乙個或幾個二進位制位即可。基於這種考慮,c語言又提供了一種叫做位域的資料結構。

例如:

struct stu

;

:後面的數字用來限定成員變數占有的位數。成員m沒有被限制,根據資料型別可推算出它占有4個位元組(byte)的記憶體。成員n,ch被:後面的數字限制,不能再根據資料型別計算長度,它們分別占有4,6位(bit)的記憶體。

n,ch的記憶體有限,資料稍微大點會造成資料溢位,例如:

分析:對於n,ch,第一次輸出的資料是完整的,第二次輸出的資料是殘缺的。

第一次輸出時,n和ch的值分別是0xe,0x24(』$'對應的ascii碼為0x24),換算成二進位制是1110、100100,都沒有超過限定的位數,能夠正常輸出。

第二次輸出時,n和ch的值分別為0x2d、0x7a(『z』對應的ascii碼為0x7a),換算成二進位制分別是101101、1111010,都超過了限定的位數。超出部分被直接截去,剩下1101、111010,換算成十六位進製為0xd、0x3a(0x3a對應的字元是:)。

c語言標準規定,位域的寬度不能超過它所依附的資料型別的長度。

例如上面的stu,n的型別是unsigned int ,長度為4個位元組,共有32位,那麼n後面的數字不能超過32.

我們可以認為,位域技術就是在成員變數所占有的記憶體中選出一部分位寬來儲存資料。

c語言標準規定,只有有限的幾種資料型別可以用於位域。

c語言標準中沒有規定位域的具體儲存方式,不同編譯軟體有不同的實現方式,它們都盡量壓縮位域的儲存空間。

位域的具體儲存規則如下:

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

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

2.當相鄰成員的型別不同時,不同的編譯器有不同的實現方案,gcc 會壓縮儲存,而 vc/vs 不會。

3.如果成員之間穿插著非位域成員,那麼不會進行壓縮。

位域成員可以沒有名稱,只給出資料型別和位寬。

無名位域一般用來作填充或者調整成員位置。因為沒有名稱,無名位域不能使用。

C語言位域

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

C語言位域

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

C語言 位域

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