Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

구조체를 활용한 C 언어 비트 필드 완벽 이해하기

비트 필드(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가 출력되는 것입니다. 이처럼 비트 필드를 사용할 때는 자료형별 표현 범위를 반드시 고려해야 합니다.