有時,儲存1個資訊不必占用1個位元組,只需二進位制的1個(或多個)位就夠用。如果仍然使用結構型別,則造成記憶體空間的浪費。
為此,c語言引入了位段型別。
位段的概念與定義所謂位段型別, 是一種特殊的結構型別,其所有成員均以二進位制位為單位定義長度,並稱成員為位段。
例如,cpu的狀態暫存器,按位段型別定義如下:
struct status
flags;
記憶體分布記憶體分布按照記憶體對齊原則
struct data;
cout<匿名位段
匿名位段就是沒有變數名,用填充空間,是空間位元組對齊
位擴充套件問題
struct data;
當用成員給其他非位段變數賦值時要進行位擴充套件
位段有符號——》被賦值無符號 (由於n為有符號數,所以n先被擴充套件為1111 1111,a再取值)
struct data node;
node.n = 3;
unsigned short int a = node.n;
cout<位段有符號——》被賦值有符號 (由於n為有符號數,所以n先被擴充套件為1111 1111,a再取值)
struct data node;
node.n = 3;
short int a = node.n;
cout<位段無符號——》被賦值無符號 (由於x為無符號數,所以n先被擴充套件為0000 0001,a再取值)
struct data node;
node.x = 3;
unsigned short int a = node.x;
cout<位段無符號——》被賦值有符號 (由於x為無符號數,所以n先被擴充套件為0000 0001,a再取值)
struct data node;
node.x = 3;
unsigned short int a = node.x;
cout<以下幾點要注意
位段成員必須是整型或者字元型,不能是浮點型。
由於位段成員沒有位址,所以不能求對位段成員求位址,不能通過scanf讀入位段值,不能用指標指向位段成員。但是非位段成員可以取位址。
char型別的位段不能橫跨兩個位元組,如下面程式
c語言 位段
位段 位段的宣告和結構是類似的,有兩個不同 1 位段的成員必須是int unsigned int char 或 signed int。2 位段的成員後邊有乙個冒號和乙個數字。例子 include include struct a struct b struct c int main 經過 驗證 1 ...
C語言位域 位段
有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如開關只有通電和斷電兩種狀態,用0和1表示足以,也就是用乙個二進位。所以c語言又提供了一種資料結構,稱為位域或 位段。位域在應用開發中較少使用,你可以暫時跳過,遇到相關問題再回來溫習。所謂 位域 是把乙個位元組中的二進位...
C語言位域 位段
有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如開關只有通電和斷電兩種狀態,用0和1表示足以,也就是用乙個二進位。所以c語言又提供了一種資料結構,稱為位域或位段。位域在應用開發中較少使用,你可以暫時跳過,遇到相關問題再回來溫習。所謂 位域 是把乙個位元組中的二進位劃...