C語言位段

2021-09-25 18:59:56 字數 1795 閱讀 9514

有時,儲存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語言又提供了一種資料結構,稱為位域或位段。位域在應用開發中較少使用,你可以暫時跳過,遇到相關問題再回來溫習。所謂 位域 是把乙個位元組中的二進位劃...