C 비트 필드C Bit Fields

구조 선언자는 구조체 또는 공용 구조체의 멤버에 대한 선언자일 뿐만 아니라 “비트 필드"라는 지정된 비트 수로 구성될 수도 있습니다.In addition to declarators for members of a structure or union, a structure declarator can also be a specified number of bits, called a "bit field." 해당 길이는 필드 이름에 대한 선언자에서 콜론으로 설정됩니다.Its length is set off from the declarator for the field name by a colon. 비트 필드는 정수 데이터 형식으로 해석됩니다.A bit field is interpreted as an integral type.

구문Syntax

struct-declarator:struct-declarator:
declaratordeclarator

type-specifier declarator opt: constant-expressiontype-specifier declarator opt: constant-expression

constant-expression은 필드의 너비(비트)를 지정합니다.The constant-expression specifies the width of the field in bits. declarator에 대한 type-specifierunsigned int, signed int 또는 int여야 하고 constant-expression은 음수가 아닌 정수 값이어야 합니다.The type-specifier for the declarator must be unsigned int, signed int, or int, and the constant-expression must be a nonnegative integer value. 이 값이 0인 경우 선언에는 declarator가 없습니다.If the value is zero, the declaration has no declarator. 비트 필드의 배열, 비트 필드에 대한 포인터 및 비트 필드를 반환하는 함수는 허용되지 않습니다.Arrays of bit fields, pointers to bit fields, and functions returning bit fields are not allowed. 선택적 declarator는 비트 필드 이름을 지정합니다.The optional declarator names the bit field. 비트 필드는 구조체의 일부로만 선언할 수 있습니다.Bit fields can only be declared as part of a structure. address-of 연산자(&)는 비트 필드 구성 요소에 적용할 수 없습니다.The address-of operator (&) cannot be applied to bit-field components.

명명되지 않은 비트 필드는 참조할 수 없으며 런타임에 해당 콘텐츠를 예측할 수 없습니다.Unnamed bit fields cannot be referenced, and their contents at run time are unpredictable. 정렬 목적으로 "더미" 필드로 사용할 수 있습니다.They can be used as "dummy" fields, for alignment purposes. 너비가 0으로 지정된 명명되지 않은 비트 필드의 경우 struct-declaration-list에서 해당 필드 다음에 나오는 멤버의 저장소가 int 경계에서 시작됩니다.An unnamed bit field whose width is specified as 0 guarantees that storage for the member following it in the struct-declaration-list begins on an int boundary.

또한 비트 필드는 비트 패턴을 포함할 만큼 충분히 길어야 합니다.Bit fields must also be long enough to contain the bit pattern. 예를 들어 다음 두 문은 올바르지 않습니다.For example, these two statements are not legal:

short a:17;        /* Illegal! */  
int long y:33;     /* Illegal! */  

이 예제에서는 screen이라는 구조체의 2차원 배열을 정의합니다.This example defines a two-dimensional array of structures named screen.

struct   
{  
    unsigned short icon : 8;  
    unsigned short color : 4;  
    unsigned short underline : 1;  
    unsigned short blink : 1;  
} screen[25][80];  

이 배열에는 2,000개의 요소가 있습니다.The array contains 2,000 elements. 각 요소는 4개의 비트 필드 멤버, 즉 icon, color, underlineblink를 포함하는 개별 구조체입니다.Each element is an individual structure containing four bit-field members: icon, color, underline, and blink. 각 구조체의 크기는 2바이트입니다.The size of each structure is two bytes.

비트 필드는 정수 형식과 의미 체계가 같습니다.Bit fields have the same semantics as the integer type. 즉, 비트 필드는 포함된 비트 수에 관계없이, 동일한 기본 형식의 변수가 사용되는 것과 정확히 동일한 방식으로 식에서 사용됩니다.This means a bit field is used in expressions in exactly the same way as a variable of the same base type would be used, regardless of how many bits are in the bit field.

Microsoft 전용Microsoft Specific

int로 정의된 비트 필드는 부호 있음으로 처리됩니다.Bit fields defined as int are treated as signed. ANSI C 표준에 대한 Microsoft 확장은 비트 필드에 대해 charlong 형식(signedunsigned 둘 다)을 허용합니다.A Microsoft extension to the ANSI C standard allows char and long types (both signed and unsigned) for bit fields. 기본 형식 long, short 또는 char(signed 또는 unsigned)을 갖는 명명되지 않은 비트 필드는 기본 형식에 맞게 강제로 경계에 맞춰 정렬됩니다.Unnamed bit fields with base type long, short, or char (signed or unsigned) force alignment to a boundary appropriate to the base type.

비트 필드는 최하위 비트에서 최상위 비트까지 정수 내에 할당됩니다.Bit fields are allocated within an integer from least-significant to most-significant bit. 다음 코드에서In the following code

struct mybitfields  
{  
    unsigned short a : 4;  
    unsigned short b : 5;  
    unsigned short c : 7;  
} test;  

int main( void );  
{  
    test.a = 2;  
    test.b = 31;  
    test.c = 0;  
}  

비트는 다음과 같이 정렬됩니다.the bits would be arranged as follows:

00000001 11110010  
cccccccb bbbbaaaa  

8086 프로세서 제품군은 높은 바이트 앞에 낮은 바이트의 정수 값을 저장하므로 0x01F2보다 높은 정수는 0xF20x01로 실제 메모리에 저장됩니다.Since the 8086 family of processors stores the low byte of integer values before the high byte, the integer 0x01F2 above would be stored in physical memory as 0xF2 followed by 0x01.

Microsoft 전용 종료END Microsoft Specific

참고 항목See Also

구조체 선언Structure Declarations