C語言位欄位

2021-07-04 16:39:16 字數 1152 閱讀 8255

位欄位

c語言中一種儲存結構,不同於一般結構體的是它在定義成員的時候需要指定成員所佔的位數。

乙個位欄位必須儲存在同乙個位元組中不能跨越兩個位元組

.如果乙個位元組所剩空間不夠存放另乙個位字段時

,將從下一位元組起存放此位字段

.可以定義無名位字段

,這時它只用來作填充或調整位置

.0寬度的無名位字段用來使下乙個位字段從新的位元組起始位置開始儲存

,達到調整某位欄位從下一位元組開始的目的,例如

struct packeddatatype;

例1:

structword ;

前兩個欄位都是char型別,第三個是int型別,所有型別中最長的是int型別。所以字的大小是int型別長度(即4位元組)的倍數。而sizeof word的結果是4位元組(即int的1倍),這是因為word的三個字段總共7位(1+2+4),小於int的32位,且不需 考慮型別對齊問題。

例2:

structword ;

與上例一樣, 所有 型別中最長的是 int型別。所以字的大小是int型別長度(即4位元組)的倍數。而sizeof word的結果是8位元組(即int的2倍),這是因為word的三個字段總共33位(1+2+30),需要兩個int的64位才能裝下, 且不需 考慮型別對齊問題。

例3:

structword ;

所有 型別中最長的是char型別。所以字的大小是char型別長度(即1位元組)的倍數。在linux下size ofword的結果是3位元組(即char的3倍)。如果只考慮word的三個字段總共12位(3+6+3),需要兩個char的16位即能裝下,但是在linux的gcc實現下,第二個字段不能跨越兩個char(為了對齊),所以三個欄位各佔乙個位元組。共3位元組。但 乙個字段能否跨越兩個最長型別是由具體的實現決定的。

其次,我們討論word內各個field的儲存,這個和具體的實現有關。有的是從左向右分配的,有的是從右向左分配的。這個沒有規律可言。

最後,對word中的field不能進行取位址操作,這是因為指標需要對齊。但可以對word進行取位址操作。

位欄位 C語言

位字段是乙個signed int 或 unsigned innt中的一組相鄰的位,位字段由乙個結構宣告建立,該結構為每個字段提供標籤,並決定欄位的寬度。例如,以下建立4個1位欄位 struct print 也可以宣告多位如 struct print 這裡需要注意乙個問題 如果宣告的總位數超過乙個un...

C語言 位欄位

前言 在c語言中,可以單獨操控變數的位。有時候我們通常向硬體裝置傳送一兩個位元組來控制這些裝置,每個位都有特定的含義。有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便。c語言又...

C語言中的位欄位

位欄位 bit filed 是c語言中一種儲存結構,不同於一般結構體的是它在定義成員的時候需要指定成員所佔的位數。位字段是乙個signed int或unsigned int型別變數中一組相鄰的位 c99和c11新增了bool型別的位欄位 位欄位通過乙個結構宣告來建立,該結構宣告為每個字段提供標籤,並...