C 언어를 배우고, 그걸로 먹고 사는 프로그래머로써,
반드시 소장해야 할 책을 한권 뽑아 보자면, 바로 이 책입니다.
The C Programming Language. 2 Ed. by Brian W. Kernighan, Dennis M. Ritchie.
http://www.yes24.com/24/Goods/234925?Acode=101 (주: 참고로 이 책의 번역본은 번역이 정말 참단한 수준이라, 가능하면 원서를 보는 게 좋습니다.)
커니핸(주: 커니건 아님)과 리치는 바로 C 언어를 만든 사람이고, 저 책은 그들이 직접 쓴 책입니다. 이 책은 274쪽 밖에 안되는 얇팍한 책이지만, 이 안에 들어 있는 내용은 정말 방대합니다. 개인적으로는 이 책을 10번 이상 완독했고, 여태껏 수천번은 펴봤지만, 볼때마다 새로운 내용이 튀어나오는 판도라의 상자와 같은 책입니다. 그리고, 실제로 문제가 닥쳤을때 이 책에서 답을 얻은 경우도 있습니다.
C 언어에서 가장 기본이 되는 변수 타입은 int 이고, 이는 항상 signed int 입니다. 또한, 별도의 선언이 없다면 함수의 리턴 타입 역시 int 라고 가정합니다. 그렇기에, 일반적으로 함수가 정상이면 0을, 에러가 발생하면 -1을 리턴합니다. 그리고 호출한 곳에서 리턴값을 보고 에러 처리를 하던가 하지요.
지극히 당연하게 동작하는 구조인데, 어느 코드에선가 문제가 생기더군요. 어떤 함수의 리턴 타입이 char 로 선언되었는데. 이를 int 타입으로 바꿔주자 문제가 발생하지 않았음을 확인했습니다. 왜 int 는 정상인데, char 는 문제가 생기느냐를 확인해 보니, char 선언이 unsigned char 로 처리되어 -1 이 실제로는 255 로 변환되고, 리턴값이 음수인지 체크하는 부분에서 문제 없이 통과되는 현상이었습니다.
게다가 특이한건 같은 코드를 몇몇 다른 시스템, 다른 OS, 다른 컴파일러에서 테스트 해보았는데, 거의 대부분 char 는 signed char 로 동작하지만, 일부 시스템에서는 unsigned char 로 동작하더군요.
이것이 컴파일러의 버그인지, OS 상의 버그인지 확인해야 했기에, 이리저리 찾아 보았고,결국 저 책에서 답을 찾았습니다. 세종실록지리지 50페지 세째줄이 아니라... 저 책의 195쪽 밑에서 6째줄에 관련 내용이 써 있더군요.
Other quantities may be stored into char variables, but the available range of values, and especially whether the value is signed, is implementation-dependent.
간단히 말해, char 가 signed 인지 unsigned 인지는 엿장수 맘대로 가 아니라 컴파일러 만든넘 맘대로 이다. 라는 것입니다. 그러니깐, 쓰는 넘이 조심해서 써야 한다. 라는 결론이더군요.
아마, 이 책은 앞으로도 C 프로그래밍 하는 동안은 꾸준히 열어 보게 되겠죠.
- 엔델 -