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