首頁  >  文章  >  後端開發  >  C中的位域

C中的位域

WBOY
WBOY轉載
2023-09-08 22:57:031404瀏覽

C中的位域

在本節中,我們將了解什麼是 C 語言中的位元欄位。

假設您的C 程式包含許多TRUE/FALSE 變量,這些變數分組在稱為狀態的結構中,如下-

struct {
   unsigned int widthValidated;
   unsigned int heightValidated;
} status;

該結構需要8 位元記憶體空間,但實際上,我們將在每個變數中儲存0 或1。在這種情況下,C 程式語言提供了一種更好的方法來利用記憶體空間。

如果您在結構體中使用此類變量,那麼您可以定義變數的寬度,告訴 C 編譯器您正在使用將僅使用這些位數。例如,上面的結構可以重寫如下 -

struct {
   unsigned int widthValidated : 1;
   unsigned int heightValidated : 1;
} status;

上述結構需要 4 位元狀態變數的記憶體空間,但僅使用 2 位元來儲存值。

如果最多使用 32 個變量,每個變數的寬度為 1位,那麼狀態結構也會使用 4 位。然而,一旦你有 33 個變量,它就會分配記憶體的下一個槽,並且開始使用 8 位元。讓我們檢查以下範例來理解這個概念-

範例程式碼

 即時示範

#include <stdio.h>
#include <string.h>
/* define simple structure */
struct {
   unsigned int widthValidated;
   unsigned int heightValidated;
} status1;
/* define a structure with bit fields */
struct {
   unsigned int widthValidated : 1;
   unsigned int heightValidated : 1;
} status2;
int main( ) {
   printf( "Memory size occupied by status1 : %d</p><p>", sizeof(status1));
   printf( "Memory size occupied by status2 : %d</p><p>", sizeof(status2));
   return 0;
}

輸出

Memory size occupied by status1 : 8
Memory size occupied by status2 : 4

位元域宣告:

#位元域宣告在結構內具有以下形式-

struct {
   type [member_name] : width ;
};

下表描述了位元欄位的變數元素-

##元素描述type決定如何解釋位元欄位值的整數類型。類型可以是 int、signed int 或 unsigned int。 member_name位元欄位的名稱。 寬度位元欄位中的位元數。寬度必須小於或等於指定類型的位元寬度。
th>
以預先定義寬度定義的變數稱為位元域。一個位元字段可以容納多個位元;例如,如果您需要一個變數來儲存從0到7的值,那麼您可以定義一個寬度為3位元的位元字段,如下所示-

struct {
   unsigned int age : 3;
} Age;

上面的結構定義指示C 編譯器,age 變數將只使用3 位元來儲存值。如果您嘗試使用超過 3 位,那麼它將不允許您這樣做。讓我們嘗試以下範例 -

範例程式碼

 即時示範

#include <stdio.h>
#include <string.h>
struct {
   unsigned int age : 3;
} Age;
int main( ) {
   Age.age = 4;
   printf( "Sizeof( Age ) : %d</p><p>", sizeof(Age) );
   printf( "Age.age : %d</p><p>", Age.age );
   Age.age = 7;
   printf( "Age.age : %d</p><p>", Age.age );
   Age.age = 8;
   printf( "Age.age : %d</p><p>", Age.age );
   return 0;
}

輸出

Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0

以上是C中的位域的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除