반응형

비트 필드

 

 

앞서 우리는 새로운 구조체를 정의하고 구조체 변수를 선언한 뒤

 

구조체 멤버에 접근하여 구조체 멤버 변수를 사용하는 방법을 학습했다.

 

또한

 

구조체 멤버를 만들 때 최소 단위가 문자형 바이트 단위로 구조체 멤버를 만들 수도 있었다.

 

이번 글에서는 비트 단위로 구조체 멤버를 할당하는 비트 구조체에 대해서 배워보자.

 

-

 

비트 구조체 비트 단위를 데이터 크기로 하는 멤버를 갖는 구조체

 

해당 구조체의 멤버를 비트 필드(bit field)라고 한다.

 

구조체에서 비트 필트를 사용할 수 있는 내용에 대한 설명은

 

일반적인 C 언어 입문서는 설명하지 않는 경우도 많다.

 

비트 필드는 나중에 프로토콜 헤더를 만들 때 즉 네트워크 프로그래밍을 할 때

 

비트 단위로 사용해야 하는 때가 많다.

 

비트 필드를 포함한 구조체를 정의하는 방법은 다음과 같다.

 

-

 

 

-

 

위의 내용은 구조체 멤버 a, b, c가 각각 2bit, 2bit, 4bit의 크기를 갖는 멤버를 정의한 것으로

 

비트 필드를 정의하기 위해서는 구조체 안에서 각 멤버를 선언한 뒤

 

':' 구분자를 두고 몇 비트를 사용할 것인지 명시하면 된다.

 

 

비트 필드를 선언할 때 각각의 멤버가 메모리에 저장되는 순서

 

시스템의 엔디언(Endianness) 방식에 따라 달라진다.

 

 

 

엔디언(Endianness)이란

 

컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻하며

 

byte를 배열하는 방법을 특히 바이트 순서(Byte Order)라고 한다.

 

 

엔디언 큰 단위가 앞에 나오는 빅 엔디언(Big-endian)

 

작은 단위가 앞에 나오는 리틀 엔디언(Little-endian)으로 나눌 수 있는데

 

이 부분에 대한 자세한 설명은 포인터에 대해 학습한 뒤에 후반부에서 다시 한번 설명하도록 한다.

 

다음의 예제를 봐보자.

 

-

 

test46.c
0.00MB

 

 

 

-

 

위의 예제를 실행한 결과는 위와 같다.

 

구조체의 전체 크기는 1byte이지만

 

이를 구조체 멤버 a, b, c 변수 각각 2bit, 2bit, 4bit로 나누어 할당한 뒤에 값을 저장하고

 

그 값을 출력하여 확인한다.

 

 

일반적인 Intel 계열의 x86 CPU는 리틀 엔디안 방식을 사용하는데

 

이와 같은 환경에서 선언하는 비트 필드 높은 메모리의 주소 공간부터 저장되게 된다.

 

즉 위 예제의 구조체의 비트 필드가 선언된 구조는 다음 그림과 같다.

 

-

 

 

반응형

'시작하지 말았어야 했던 것 > C언어 기본 문법' 카테고리의 다른 글

25. 구조체와 공용체의 혼용  (0) 2021.02.01
24. 공용체  (0) 2021.02.01
22. 구조체 초기화  (0) 2021.02.01
21. 구조체 정의  (0) 2021.02.01
20. 조건부 컴파일  (0) 2021.02.01

+ Recent posts