關於位段的基本形式
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語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位...