位置:首頁 > 高級語言 > C語言教學 > 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
", sizeof(status1));
   printf( "Memory size occupied by status2 : %d
", 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 位字段的名稱
width 位字段的比特數。寬度必須小於或等於指定的類型的比特寬度

具有預定義寬度所定義的變量被稱為位域。位字段可容納超過例如一個位,如果需要一個變量來存儲值從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
", sizeof(Age) );
   printf( "Age.age : %d
", Age.age );

   Age.age = 7;
   printf( "Age.age : %d
", Age.age );

   Age.age = 8;
   printf( "Age.age : %d
", Age.age );

   return 0;
}

當上述代碼被編譯它會警告在編譯和執行時,它產生了以下結果:

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