C++에서 정수 다루기

(작성중인 글)

정수를 나타내는 방법

디지털 컴퓨터에서, 정보의 최소 단위인 비트는 두 가지 상태만을 가진다. 즉, 컴퓨터로 “무엇인가를” 표현하기 위해서는 그것을 0과 1로만 나타낼 수 있어야 된다는 것이다.

예를 들어, 시각(時刻), 색, 사진, 음악은 보통 다음과 같이 기록된다.

  • 시각은 특정 시점을 잡은 뒤, 그 시점부터 지난 시간을 세어 기록한다.
  • 색은 적절한 색 공간을 잡은 뒤, 그 공간 상의 좌표를 이용해 기록한다.
  • 사진은 작은 영역들(픽셀)로 나눈 뒤, 각 영역의 색을 이용해 기록한다.
  • 소리는 일정한 시간마다 공기의 압력을 측정하고, 측정값을 일렬로 기록한다.

이 모든 것의 기본은 숫자, 그 중에서도 정수를 0과 1로 나타내는 것이다. 언뜻 보면 매우 간단해 보이는 일이다. 그냥 이진법으로 숫자를 나타내면 되는 거 아닌가?

하지만 여기에는 다음과 같은 세 가지 문제점이 숨겨져 있다.

  1. 숫자 하나를 나타내는 데 비트를 몇 개 써야 할까?
  2. 음수는 어떻게 나타내어야 할까?
  3. 비트(혹은 비트의 묶음인 바이트)의 순서는 어떻게 정할까?

이번 글에서는 1번과 2번에 초점을 두어, C++에서 정수를 다룰 때 어떤 점을 주의해야 할 지에 대해 이야기해 보자. C++ 이외에도 러스트, 파이썬, 자바스크립트와 같은 다른 언어에 대해서도 간단히 다룰 것이지만, C++에서 흥미로운 문제를 많이 다룰 수 있으므로(?) C++을 메인으로 삼는다.

3번의 경우 리틀 엔디언 / 빅 엔디언 등과 관련이 있는 문제로, 네트워크 프로그래밍이나 여러 CPU를 고려해야 되는 코드의 경우 추가적으로 고려해야 되는 점이다. 하지만 나는 빅 엔디언을 사용하는 프로그래밍을 해 본 경험이 거의 없기 때문에 이 글에서는 굳이 다루지 않기로 하자.

간단히 말해, 모든 코드는 x86 혹은 amd64 아키텍처 상에서 돌아간다고 가정하자.

오버플로우

메모리가 허락하는 한, 숫자 하나를 표현하는 데 필요한 비트의 수에는 제한이 없다. 예를 들어, 대략 10메가바이트의 메모리를 이용하면 현재까지 알려진 제일 큰 소수인 M82589933을 표현할 수 있다.