C 언어에서 char는 1 byte지만, 8 bit가 아닐 수 있다
C 언어를 처음 배울 때 “1 byte는 8 bit이고, char 자료형은 1 byte다”라고 배운다.
대부분의 환경에서는 맞지만, 재밌게도 C 표준이 말하는 내용은 조금 다르다.
C 표준은 자료형의 크기를 물리적인 비트 수로 고정하지 않고 하한선을 지정해, 하드웨어 환경에 맞춰 유연하게 구현할 수 있도록 허용한다.
이 글은 C99 표준 초안 N1256를 참고하여 설명한다.
char는 무조건 1 byte이다
6.5.3.4. The sizeof operator
When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1.
sizeof 연산자는 자료형의 크기를 byte 단위로 반환한다.
그리고 표준은 sizeof(char)가 항상 1임을 보장한다.
따라서 하드웨어 환경이 어떻게 바뀌든 C 언어에서 char의 크기는 언제나 1 byte다.
하지만 1 byte가 8 bit가 아닐 수 있다
여기서 혼란이 생긴다.
C언어가 정의하는 byte는 우리가 아는 8비트(Octet)와 다른 개념일 수 있다.
3.6 byte
A byte is composed of a contiguous sequence of bits, the number of which is implementation-defined.
표준에 따르면 1 byte를 구성하는 bit의 수는 구현체(컴파일러와 하드웨어 환경)에 따라 달라질 수 있다.
단, 최소 8비트 이상이어야 한다는 조건은 존재한다.
실제로 임베디드나 DSP 환경에서는 1 byte가 8 bit가 아닌 경우가 존재한다.
예를들어 Texas Instruments의 TMS320C28x 문서(Section 6.4)를 보면, 이 환경에서는 char 자료형이 16 bits로 구현되어 있다.
즉, 이 시스템에서는 1 byte가 16 bits인 것이다.
내 환경에서 char 또는 1 byte는 몇 bit일까?
<limits.h> 헤더에 정의된 CHAR_BIT 매크로를 확인하면 된다.
#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("%d", CHAR_BIT); // 대부분의 환경에서 8
return 0;
}