Latest web development tutorials

C 비트 필드

프로그램의 구조는 하나 이상의 디지털 단지 TRUE / FALSE 변수가 포함 된 경우로는 다음과 같습니다 :

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

이 구성은 메모리 공간의 8 바이트를 요구하지만, 실제로, 각 변수에, 우리는 0 또는 1을 저장한다. 이 경우, C 언어 방식으로 메모리 공간의 활용도를 제공한다. 당신이 구조 내에서 같은 변수를 사용하는 경우, 당신은 당신 만 바이트를 사용하는 컴파일러에게 변수의 폭을 정의 할 수 있습니다. 예를 들어, 상기 구조는 다음과 같이 재 표현 될 수있다 :

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

자, 위의 구조, 상태 변수는 4 바이트의 메모리를 차지하지만 두 값을 저장하는 데 사용됩니다. 당신이 32 변수, 하나의 각 변수 폭을 사용하는 경우, 상태 구조는 4 바이트를 사용합니다,하지만 당신은 (33) 변수를 사용하는 경우 더 많은만큼 당신이 변수를 사용할 때, 그것은 할당 된 메모리의 섹션 될 것입니다 제 33 변수는 8 바이트를 사용하여 시작하는이 시간이 저장됩니다. 이제이 개념을 이해하기 위해 다음 예를 살펴 보자 :

#include <stdio.h>
#include <string.h>

/* 定义简单的结构 */
struct
{
  unsigned int widthValidated;
  unsigned int heightValidated;
} status1;

/* 定义位域结构 */
struct
{
  unsigned int widthValidated : 1;
  unsigned int heightValidated : 1;
} status2;
 
int main( )
{
   printf( "Memory size occupied by status1 : %d\n", sizeof(status1));
   printf( "Memory size occupied by status2 : %d\n", sizeof(status2));

   return 0;
}

상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를

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

비트 필드 선언

다음과 같이 비트 필드 구조체 선언은 다음과 같습니다

struct
{
  type [member_name] : width ;
};

다음은 비트 필드 변화 소자에 대하여 설명한다 :

元素描述
type整数类型,决定了如何解释位域的值。类型可以是整型、有符号整型、无符号整型。
member_name位域的名称。
width位域中位的数量。宽度必须小于或等于指定类型的位宽度。

미리 정의 된 폭이변수는 비트 필드라고합니다.비트 필드는 다음과 같이 세 개의 비트 필드의 폭을 정의 할 수 있고, 0 ~ 7까지의 값을 저장하는 변수를 필요로, 예를 들어, 두 개 이상의 전화 번호를 저장할 수있다 :

struct
{
  unsigned int age : 3;
} Age;

이상의 세 가지를 사용하려고하면 방향 C 컴파일러 위의 구조의 정의, 연령은 만 완료 할 수 없습니다,이 값을 저장하기 위해 세 개의 변수를 사용합니다. 이제 다음 예를 보자 :

#include <stdio.h>
#include <string.h>

struct
{
  unsigned int age : 3;
} Age;

int main( )
{
   Age.age = 4;
   printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
   printf( "Age.age : %d\n", Age.age );

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

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

   return 0;
}

상기 코드가 실행되면 상기 코드를 컴파일하는 경우, 경고가 전달되며, 다음과 같은 결과를 얻을 :

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