코딩을 하다보면 필연적으로, 버그가 생길 수밖에 없다

그 중 대표적인 게 계산 오류다

결코 음수가 되어서는 안 되는 값, 예를 들어 나이를 변수로 나타낸다고 하자

그리고 나이가 10살인 사람이 30년 전에는 몇 살이었는지 알아내는 코드를 작성하였다

프로그램 수행 결과는? -20살. 이것은 명백하게 틀린 결과다. 버그지

따라서 이번에는 이 문제를 해결하기 위해 나이 변수를 unsigned로 바꿔 보자

수행 결과는? 4294967276살... 근데 이건 명백하게 틀린 결과가 아니다. 사람 눈에는 분명 이상해 보이지만, 그건 우리에게 상식과 교양이 있기 때문이고, 컴퓨터는 그런 게 없기 때문이다

컴퓨터 같은 멍텅구리도 이해할 만한 기준인, if (age < 0) puts("뭔가가 잘못됐다"); 를 사용할 수 없다는 거다

몇몇 언어는 unsigned 변수에서 오버플로가 발생할 경우 자동으로 오류를 띄우는 경우가 있다. 이런 언어에서는 unsigned를 써도 된다. 문제가 실제로 발견되기 때문이다

그러나 C나 C++처럼 그런 메커니즘이 없는 언어에서 unsigned나 size_t를 쓰면 오히려 문제가 빨리 발견되는 걸 막고 한참 후에야 이마를 치게 만든다

과거에 만들어진 레거시 시스템과 상호작용하려는 목적을 제외하면, C와 C++로 신규 개발되는 시스템은 가급적 unsigned를 배제해야 한다