C C 中結構體中的冒號 位域

2021-09-02 01:13:08 字數 801 閱讀 8995

c++中位域的形式:

struct st1

;struct st2

;struct st3

;

位域的語法是通過在變數名的後面加冒號,然後再帶位數宣告的。

位域的意思就是,對於變數a,我不需要unsigned int這麼大的空間來儲存資料,我只需要2個bit來儲存資料。也就是說,位域能夠把基礎型別的記憶體空間,按bit來劃分。

關於位域使用,需要注意的問題:

每乙個基礎型別的空間,如果沒有被分完,剩下的bit也會占用記憶體。例如,上面的結構體st1,實際上只使用了9個bit,但是sizeof(st1) = 4個位元組;

當乙個基礎型別的空間被分完後,會自動按此基礎型別的空間大小分配乙個記憶體空間。例如,結構體st2,a和b超過了4個位元組,所以sizeof(st2) = 8個位元組;

關於結構體的賦值。結構體st1.a只能接收2個bit的資料,st2.b只能接收3個bit的資料。基礎型別為有符號型和無符號型時,所表示的結果還不一樣。比如,結構體st3中,將二進位制10賦給st3.a,結果輸出為0;將二進位制101賦值給st3.b,輸出結果為-3;將二進位制0101賦值給st3.c,輸出結果為5。計算規則為:根據基礎型別擴充套件變數,st3.a賦值為二進位制10,符號位為1,擴充套件成int型別1111 1111 1111 1110,即除位域外的其餘位數都用符號位擴充套件,這裡的1111 1111 1111 1110是記憶體中直接儲存的資料,因此是補碼,轉成原始碼為-2;st3.b賦值為二進位制101,符號位為1,擴充套件後為1111 1111 1111 1101,轉成原始碼為-3;st3.c賦值為二進位制0101,符號位為0,直接計算得5

C結構體中的冒號 位域

c語言提供直接定義和訪問乙個字中的位字段的能力,而不需要通過按位邏輯運算子。毋庸置疑,位域的引入給使用者的最大的好處莫過於可以有效的利用 昂貴 的記憶體和操作bit的能力了。而且這種操作bit位的能力很是方便,利用結構體網域名稱即可對這些bit進行操作。例如 struct foo struct fo...

結構體的位域 變數 冒號

先看例子 1 typedef struct test a的長度為4bits,是uint型的,如果test.a 16,由於超過範圍,所以溢位,a 0 偏移量為0 0的意思是補齊,就是第乙個4位元組的只使用了前面四位,後面的全部補0 b 1佔1bits,c 7佔7bits,他們的型別一樣以可以合併乙個位...

結構體之位域詳解(C語言結構體中的冒號)

在資料儲存時,有些時候並不需要占用乙個完整的位元組,比如數值 1,只需要占用乙個bit 二進位制 1 數值2 只需占用2個bit 二進位制 10 在這樣不需要太多bit來表示乙個數值時候,為了節省儲存空間,c語言提供了一種資料結構,稱之為 位域 允許在程式中按照其網域名稱進行操作,這樣就可以使得多個...