位段操作問題

2021-05-01 17:45:12 字數 857 閱讀 6145

struct a 

unsigned char a:4;

unsigned char b:2;

unsigned char c:2;

char ch = 0x45;//0100,0101

struct a *aa = (struct a*)&ch;

《c程式設計》-譚浩強 p306 圖12.6所示原理,struct a 的記憶體分布如下:

0100 | 01 | 01

//位序:7~0

a       | b   | c

那麼aa->a = 4;

aa->b = 1;

aa->c = 1;

實際上,這是個錯誤的結果(xp+vc6.0),

aa->a = 5;

aa->b = 0;

aa->c = 1;

這是為什麼呢?主要是書上圖12.6不夠清晰,沒有標明位(bit)序,容易造成誤解,我們知道,結構體中

a,b,c的排列順序是:a--b--c,位序從低到高,那麼,實際上,a,b,c在記憶體中的位置應該是:

01 | 00 | 0101

//位序:7~0

c   |  b   | a

如果非要轉成如書中圖12.6那樣,那麼:

1010 | 00 | 10

//位序:0~7

a       | b   |  c

這樣雖然可以,但是不符合我們常規的閱讀習慣,而且取值的時候還可以出錯,因為位元組的位序倒過來了,取值的時候也要倒過來看,

得不償失,還不如:

01 | 00 | 0101

//位序:7~0

c   |  b   | a

這樣清晰明了。取值也不會出錯。

C語言位段問題

c語言中的位段 位段 bit field 是以位為單位來定義結構體 或聯合體 中的成員變數所佔的空間。含有位段的結構體 聯合體 稱為位段結構。採用位段結構既能夠節省空間,又方便於操作。位段的定義格式為 type var digits 其中type只能為int,unsigned int,signed ...

stm32位段操作SRAM

三個寫得很好的教程 乙個小例子 include stm32f10x.h define bitband addr,bitnum addr 0xf0000000 0x2000000 addr 0xfffff 5 bitnum 2 將實際位址對映為別名區位址 由於後面定義的a為u8變數,0 bitnum ...

C語言位域 位段

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