C語言 結構體與位段(四) 關於位段

2021-10-10 16:50:16 字數 1127 閱讀 1658

關於位段的基本形式

struct s

;

那麼,大家可以感覺到他和結構體唯一的不同點

好像就是冒號和後面的數字

那麼這是什麼意思呢?

我們來求一下這個結構體的大小(詳情見第三章:記憶體對齊現象)

struct s

;

是不是4*4 = 16 個位元組啊?

是對的結構體這麼表示是16個位元組

但是當表示位段,不同點是,後面的數字表示這個變數占用多大的位元位

我們知道,乙個位元組對應8個bit位

那麼乙個int型變數就對應32個位元位,範圍是

-2147483678 ~ 2147483647

而有些時候我們用不了這麼多,並且當我們知道我們要使用的資料的具體範圍時:(比如當表示電位,使用0或1),那麼我們可以規定這個int型變數占用的位元組數,也就是冒號後面的數字

也就是說,冒號後面的數字表示我們規定這個變數占用多少個位元組,是不是很省空間啊

:位段裡不能像結構體裡的成員一樣,想儲存什麼資料都可以,位段裡只能儲存整數型別(int ,unsigned int,char,short等),且所有變數型別必須一致,比如要是有乙個int 則所有都應該是int型

關於位段大小的計算

位段最開始的時候預設開闢乙個這種型別的空間,例如int 的4個位元組,char的乙個位元組(看你是什麼型別)

大小確實精確到bit位了,但是計算時我們不能簡單的把這些bit位加起來,而是應該滿足他們的大小,不夠的我們要新開闢一塊空間

比如說現在我有乙個int a : 7;

那麼我儲存只佔7個bit位的資料就行,這塊32位的我們最開始開闢的空間現在還剩25個bit位,如果我現在有乙個 int b : 27; 那麼不好意思,這個空間已經放不下了,需要再開闢一塊空間,也就是4個位元組的int空間

最終的位段大小也就是我們開闢的這些空間的大小的和

不過別看位段相比結構體省空間,他也是有不少缺點的

比如:1.他跨平台性不好,在不同平台,int被當做有符號還是無符號不確定

2.int最大位數不一樣,比如32位機器和16位機器,int位元組數不一樣,那我寫int a: 27;就可能出錯

C語言結構體與位段

1.結構體的定義 有以下3種方法定義結構體型別變數。1 先宣告結構體型別再定義變數 2 在宣告型別的同時定義變數 例如 struct student student1,student2 3 直接定義結構體型別變數struct 變數名錶 2.結構體初始化 例如 struct student stude...

C結構體之位域 位段

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

C結構體之位域(位段)

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