C에서 int로 boolean값을 표현하는 이유

조성훈·2023년 10월 13일
0

C의 원시 자료형에는 bool type이 없습니다. (C99이상에서 <stdbool.h> 라이브러리를 사용하여 _Bool자료형을 사용할 수는 있으나)
따라서 C 코드에서 TRUE/FALSE를 판별하기 위해서는 보통 int 자료형을 쓰는 것이 일반적입니다 :
예를 들어, int is_checked 라는 flag를 세우거나, int is_upper(char c)라는 판별함수를 작성하는 경우 등..

그런데 갑작스러운 의문이 들었던 점은
0 또는 1만 판별하면 되는 일에 왜 4byte나 잡아먹는 int를 써왔던 것일까 하는 것입니다.
역사와 전통의 C라면 응당 메모리를 덜 쓰고자 하는 것이 자연스럽지 않을까요?
4byte보다는 1byte의 char를 쓰면 어떨까요? 아니면, 아예 1bit 자료형을 선언할 수는 없는 것일까요?


1bit 자료형??

먼저 앞서 생각했던, 1bit 자료형을 선언할 수 있을까요?
can I define a one bit variable?
여기에 저와 비슷한 생각을 한 사람이 있습니다.
등록된 답변으로부터, 결론부터 말하자면, 아래와 같이..

typedef struct foo
{
    unsigned x:1;
} foo;

이렇게 쓰면, 우리는 컴파일러에게 "x는 1 bit만 쓸거야"라고 말할 수 있습니다.
그러나 이렇게 쓰는 경우처럼, 우리가 1 bit를 쓰기로 하든, 2 bit를 쓰기로 하든, foobyte단위로 묶입니다. (structure packing arrangements)
따라서 우리는 1 bit만 쓰고 있지만 foounsigned int만큼의 공간을 차지합니다.
또한, 자연스럽게도, foo의 배열 또한 bit단위로 연속하지 않습니다.

C99 <stdbool.h>

C99에서 boolean type의 _Bool자료형을 포함하는 <stdbool.h>라이브러리가 추가되었다고 앞서 언급했습니다.
그럼 _Bool을 쓰면 되지 않을까요?
why use int instead of bool
_Bool보다는 int 자료형을 사용하는 데에는 몇 가지 이유가 있을 수 있습니다.

  • C99이전에, 전통적으로 0을 false, 0이 아닌 경우를 true를 뜻하도록 int를 써왔음
  • standard, internal 또는 third-party 라이브러리와의 일관성을 유지하기 위함
  • 이미 작성된 코드와의 호환성 등
  • 그저 습관일 가능성도...
    등등의 이유로 _Bool보다는 int가 아직까지도 선호되는 편입니다.

왜 하필 int?

그래서, 왜 하필 int로 쓸까요?
위에서 1 bit자료형은 어차피 byte단위로 묶인다고 했으니, char로 쓰면 더 절약적이지 않을까요?
Char or Int for boolean value in C?
여기에 저와 같은 질문을 한 사례가 있는데, 답변이 대략 이렇습니다 :
"int가 보통 더 빠른 type이며, char type으로 인한 메모리 절약은 무시할만한 수준이다 (negligible)"
여기서 int is usually the fastest type이라고 한 것은, CPU가 word의 단위로 정보를 처리함과 관련이 깊습니다.
여기에 보면 이에 대한 논의가 있습니다.
글이 좀 긴데, 중요하다고 보이는 구문은 아래입니다.

Typically, CPUs are fastest at operating on integers of their native word size (with some caveats about 64-bit systems).

(주로 32-bit 아키텍처에 대해) word사이즈에 딱 맞는 int형의 연산이 대체로 빠르다는 언급입니다.
좀 컴퓨터 아키텍처적인 부분이네요,
또한 이와 관련하여, C언어의 정수승격(promotion), 묵시적 형변환 등의 내용까지 자세히 다뤄야할 부분인 듯 합니다.
이 부분에 대해서는 나중에 포스팅을 따로 작성하도록 하고,
이정도에서 호기심 issue를 closed하도록 하겠습니다

0개의 댓글