C語言中的位域,學習小結

2021-05-21 14:20:28 字數 836 閱讀 2955

最近,在進行嵌入式裝置驅動開發時,為了節省ram空間,特意用了一下位域這個資料型別,初次使用遇到了很多問題,經過幾天的研究、學習、請教,總算有了些心得,現總結如下,已備忘:

1.在結構體中宣告位域:

typedef struct

unsigned char t1:2;

unsigned char t2:2;

unsigned short cmd:8;

}cmd_code;

問題:該結構在記憶體中佔多少位元組?

答:4位元組(vc環境,以下同)

原因:這裡涉及到結構體內存對齊的問題,本來t1、t2兩個位域都是unsigned char型別,且總的長度=4bit<8bit,所以這兩個位域在記憶體中是

連續的,但此時第乙個位元組未佔滿,那麼cmd位域是否接著存放呢,不是的,因為第乙個位元組還剩下4bit不能再容納8bit的資料,所以應該重新開闢

空間。這時候才是關鍵,編譯器怎麼分配記憶體呢?我通過實驗得出了這樣乙個結論:

首先,把前兩個域所佔的空間對齊為第三個域的型別的長度,

然後,根據記憶體對齊的原則再接著給第三個域開闢乙個unsigned short型別長度

所以,最後一共開闢了4位元組的空間。

2.在共同體中宣告位域:

typedef union

unsigned char t1:2;

unsigned char t2:2;

unsigned short cmd:8;

}cmd_code;

問題:該共同體中在記憶體中佔多少位元組呢?

答:2位元組

原因:這沒什麼好說的,共同體就是這樣定義的,共同體的長度為該共同體內佔記憶體最大的成員的長度。

C語言中位域

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

C語言中的位域

struct 位域結構名 1 使用位域可能不如使用位運算子的執行速度快,但是位域使程式更容易閱讀。2 如果某個作用域中定義了位域結構,則在該作用域中就不能使用typedef或 define來定義與位域結構名相同的型別名。3 在之前的標準中,位域型別必須是int unsigned int或signed...

C語言中的位域

2 當相鄰成員的型別不同時,不同的編譯器有不同的實現方案,gcc會壓縮儲存,而vc vs不會 請看下面的位域 bs include int main printf d n sizeof struct bs return 0 3 如果成員之間穿插著非位域成員,那麼不會進行壓縮。例如對於下面的 bs i...