C의 비트 필드(bit fields)는 구조체의 구성원으로, 표준 데이터 타입의 크기 대신 지정된 비트 수를 차지합니다. 이들은 메모리 절약에 도움을 주며, 특히 플래그 및 컴팩트 상태 세트를 저장하는 데 유용합니다.
선언:
struct Flags { unsigned int enable : 1; unsigned int mode : 2; unsigned int code : 5; };
이 예제에서는 구조체가 최소 8비트를 차지하게 되며, 3 * sizeof(unsigned int)보다 작습니다.
어디에 적용:
제한 사항 및 함정:
예제:
struct Packet { unsigned char start : 1; unsigned char id : 3; unsigned char flag : 4; };
질문: char 또는 signed int 유형을 비트 필드로 사용할 수 있습니까?
답변: C 표준은 int, unsigned int, (컴파일러 확장을 통해) 다른 표준 정수형(char, short)의 사용을 허용합니다. 그러나 이식성은 오직 int와 unsigned int에 대해서만 보장됩니다.
오류 예제:
struct Example { signed char a : 3; }; // 다양한 컴파일러/아키텍처에서 부호 및 비트 순서 저장의 규칙이 다를 수 있음.
이야기
ARM과 x86에서 소프트웨어 통합 중 비트 필드가 다르게 풀리는 것을 발견했습니다: 비트 순서 및 정렬이 달랐습니다. 이러한 차이를 고려하지 않고 설계하여 크로스 플랫폼 환경에서 데이터를 읽을 수 없게 되었습니다.
이야기
모터 컨트롤러 관리 시스템에서 비트 필드 구조체에
char유형을 잘못 사용했습니다. 일부 ARM 프로세서에서는 부호 확장이 잘못되어 플래그의 처리가 잘못되었습니다.
이야기
네트워크 프로토콜에서 메시지 플래그 패킹을 위해 비트 필드를 사용했지만, 상위 비트 필드가 초기화되지 않은 채로 남아 있는 것을 고려하지 않았습니다. 장치 간 전송 시 초기화 차이로 인해 임의의 상태 오류가 발생했습니다.