1. 정보단위

컴퓨터는 0과 1밖에 이해하지 못하는데 이 0과 1을 나타내는 가장 작은 정보 단위를 비트(bit)라고 한다. n비트는 $2^n$ 가지 정보를 표현할 수 있다.

웹 브라우저, 워드 프로세서, 포토샵 등 우리가 실행하는 모든 프로그램은 수십만, 수백만 개 이상의 0과 1로 이루어져 있다. 다시 말해, 우리가 실행하는 프로그램은 수십만 비트, 수백만 비트로 이루어져 있다. 그런데 우리가 일상적으로 프로그램의 크기를 말할 때 “이 파일은 8,920,120비트입니다.” 라고 말하지 않는다. 프로그램의 크기를 말할 때는 표현의 편의를 위해 아래와 같이 비트보다 큰 단위를 사용한다.

1바이트(1byte) 8비트(8bit)
1킬로바이트(1KB) 1,000바이트(1,000byte)
1메가바이트(1MB) 1,000킬로바이트(1,000KB)
1기가바이트(1GB) 1,000메가바이트(1,000MB)
1테라바이트(1TB) 1,000기가바이트(1,000GB)

참고로 1KB는 1,024byte, 1MB는 1,024KB… 이런 식으로 표현하는 것은 잘못된 관습이다. 이전 단위를 1,024개 묶어 표현한 단위는 KB, MB, GB, TB가 아닌 KiB, MiB, GiB, TiB이다.

<aside> 🗒️ 워드는 무엇인가?

중요한 정보 단위 중 워드라는 단위도 있다. 워드(word)란 CPU가 한 번에 처리할 수 있는 데이터 크기를 의미한다. 만약 CPU가 한 번에 16비트를 처리할 수 있다면 1워드는 16비트가 되고, 한 번에 32비트를 처리할 수 있다면 1워드는 32비트가 된다.

이렇게 정의된 워드의 절반 크기를 하프 워드(half word), 1배 크기를 풀 워드(full word), 2배 크기를 더블 워드(double word)라고 부른다. 워드 크기는 CPU마다 다르지만, 현대 컴퓨터의 워드 크기는 대부분 32비트 또는 64비트이다. 가령 인텔의 x86 CPU는 32비트 워드 CPU, x64 CPU는 64비트 워드 CPU이다.

</aside>

2. 이진법

1) 이진법 개념

수학에서 0과 1만으로 모든 숫자를 표현하는 방법을 이진법(binary)이라고 한다. 이진법을 이용하면 1보다 큰 수도 0과 1만으로 표현할 수 있다. 원리는 간단한데 숫자가 1을 넘어가는 시점에 자리 올림을 하면 된다.

우리는 일상적으로 십진수를 사용하지만, 0과 1밖에 모르는 컴퓨터에 어떤 숫자를 알려 주려면 십진수가 아닌 이진수로 알려 주어야 한다. 그런데 한가지 문제가 있는데 숫자 10을 보고 이게 십진수인지 이진수인지 구분하기 힘들 것이다. 이런 혼동을 예방하기 위해 수학적으로 표기할 때는 아래첨자 $_{(2)}$ 를 붙이고, 코드 상에서는 이진수 앞에 0b를 붙인다.

2) 2의 보수

십진수 음수를 표현할 때는 단순히 숫자 앞에 마이너스를 붙이면 된다. 그렇다면 이진수도 마이너스 부호를 붙이면 될까? 그렇지 않다. 컴퓨터는 0과 1만 이해할 수 있기 때문에 마이너스 부호를 사용하지 않고 0과 1만으로 음수를 표현한다.

0과 1만으로 음수를 표현하는 방법 중 가장 널리 사용되는 방법은 2의 보수(two’s complement)를 구해 이 값을 음수로 간주하는 방법이다. 2의 보수의 사전적 의미는 ‘어떤 수를 그보다 큰 $2^n$에서 뺀 값’을 의미한다. 예를 들어 $11_{(2)}$의 2의 보수는 $11_{(2)}$보다 큰 $2^n$, 즉 $100_{(2)}$에서 $11_{(2)}$을 뺀 $01_{(2)}$이 된다.

하지만 굳이 이렇게 사전적 의미로 어렵게 이해할 필요는 없다. 2의 보수를 매우 쉽게 표현하자면 ‘모든 0과 1을 뒤집고, 거기에 1을 더한 값’으로 이해하면 된다. 예를 들어 $11_{(2)}$의 모든 0과 1을 뒤집으면 $00_{(2)}$이고, 거기에 1을 더한 값은 $01_{(2)}$이다. 즉, $11_{(2)}$의 2의 보수(음수표현)는 $01_{(2)}$이 된다.

그런데 한가지 의문이 들 수 있다. $1011_{(2)}$을 음수로 표현하기 위한 $0101_{(2)}$과 십진수 5를 표현한 $0101_{(2)}$이 동일하게 생겼는데 어떻게 구분하는지 의문이 들 것이다. 실제로 이진수만 봐서는 이게 음수인지 양수인지 구분하기 어렵다. 그래서 컴퓨터 내부에서 어떤 수를 다룰 때는 이 수가 양수인지 음수인지를 구분하기 위해 플래그를 사용한다. 플래그는 쉽게 말해 부가 정보이다.

<aside> 🗒️ 2의 보수 표현의 한계

이진수의 음수를 표현하기 위해 2의 보수를 취하는 방식은 아직까지도 가장 널리 사용되는 방식이지만, 완벽한 방식은 아니다. 0이나 $2^n$ 형태의 이진수에 2의 보수를 취하면 아래와 같이 원하는 음수값을 얻을 수 없다.

Untitled

첫 번째 경우 자리 올림이 발생한 비트의 1을 버린다. 하지만 두번째 경우와 같이 $2^n$의 보수를 취하면 자기 자신이 되어 버리는 문제는 본질적으로 해결하기 어렵다. 즉, n비트로는 $-2^n$과 $2^n$이라는 수를 동시에 표현할 수 없다.

</aside>

3. 십육진법

이진법을 이용해 0과 1만으로 모든 숫자를 표현할 수 있다. 하지만 이진법은 0과 1만으로 모든 숫자를 표현하다 보니 숫자의 길이가 너무 길어진다는 단점이 있다. 그래서 데이터를 표현할 때 이진법 이외에 십육진법도 자주 사용한다.

십육진법(hexadecimal)은 수가 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식이다. 그리고 십진수 10, 11, 12, 13, 14, 15를 십육진법 체계에서는 각각 A, B, C, D, E, F라고도 표기한다. 참고로 십육진수의 경우는 수학적 표기 방식으로는 아래첨저 (16)을 붇이고, 코드 상에서는 숫자 앞에 0x를 붙인다.