비트 필드(bit field)는 변수의 크기를 비트(bit) 단위로 지정할 수 있게 해주는 C 언어의 기능입니다. 일반적으로 구조체(structure) 내부에 정의하여 사용하며, 메모리를 효율적으로 활용해야 하는 상황에서 유용합니다.
- 기본 단위: 1바이트(byte) = 8비트(bits)
비트 필드의 기본 문법
다음은 구조체 안에서 비트 필드를 선언하는 간단한 예시입니다.
struct info {
int x : 2;
};위 코드에서 멤버 변수 x는 2비트만 차지합니다.
비트 필드 사용 시 주의사항
- 비트 필드에 허용된 범위를 벗어나는 값을 할당하는 것은 무효입니다.
sizeof연산자와 주소 연산자(&)를 비트 필드에는 적용할 수 없으므로,scanf함수로 비트 필드에 값을 직접 입력받을 수 없습니다.- 비트 필드에 사용할 수 있는 자료형은
int,signed int,unsigned int입니다.
예제 1: unsigned int 비트 필드
다음은 구조체 내부에 unsigned int 타입의 비트 필드를 선언한 C 프로그램입니다.
#include<stdio.h>
struct info{
unsigned int x:3; // 구조체 내부에 unsigned int 비트 필드 선언
};
main(){
struct info i;
i.x=8;
printf("%d",i.x);
}
실행 결과
0
결과 설명
- unsigned int의 표현 범위 공식은 0 ~ 2ⁿ−1이며, 여기서 n은 비트 수입니다.
- 이 프로그램에서 n=3이므로 표현 범위는 0 ~ 2³−1, 즉 0부터 7까지입니다.
- 범위를 초과하는 8을 할당하면 값이 잘려서(wrap around) 0이 출력됩니다.
예제 2: int(부호 있는 정수) 비트 필드
다음은 구조체 내부에 int 타입의 비트 필드를 선언한 프로그램입니다.
#include<stdio.h>
struct info{
int x:3; // 구조체 내부에 int 비트 필드 선언
};
main(){
struct info i;
i.x=4;
printf("%d",i.x);
}
실행 결과
-4
결과 설명
- 부호 있는 int의 표현 범위 공식은 −2ⁿ⁻¹ ~ 2ⁿ⁻¹−1이며, n은 비트 수입니다.
- 이 프로그램에서 n=3이므로 공식에 대입하면 다음과 같습니다.
= −2³⁻¹ ~ 2³⁻¹−1
= −2² ~ 2²−1
= −4 ~ 3, 즉 −4, −3, −2, −1, 0, 1, 2, 3
따라서 3비트 부호 있는 비트 필드에 4(이진수 100)를 할당하면, 최상위 비트가 부호 비트로 해석되어 −4가 출력되는 것입니다. 이처럼 비트 필드를 사용할 때는 자료형별 표현 범위를 반드시 고려해야 합니다.