[1주1장 CS] 컴퓨터는 어떻게 자연수와 정수를 나타낼까?

태그 1주1장 CS

한 주에 한 장씩 읽는 컴퓨터과학. 이번 주는 컴퓨터에서 어떻게 자연수와 정수를 나타내는지 알아봅니다.


chevron_right

목차


서론

이번 주부터 매주 한 장씩 컴퓨터과학에 대해 알아보는 시리즈를 시작합니다. 이번 주의 주제, “컴퓨터는 어떻게 음수를 나타낼까?”입니다.

진법

진법과 이진법에 대해 잘 알고 계시다면 이 장을 건너뛰어도 좋아요.

진법은 밑이 bb일 때 00 ~ (b1)(b-1)까지의 숫자를 사용, 더 큰 수는 자릿수를 올려 표현하는 기수법을 말합니다. 밑에 따라 bb진법이라고 부르고, 위치에 따라 수를 나타내기 때문에 위치 기수법이라고도 합니다. [1] 우리가 흔히 사용하는 진법은 10진법으로, 밑이 10이고 0~9까지의 숫자를 사용합니다.

진법으로 나타낸 수는 ii번째 자리의 수를 aia_i라 하고 밑을 bb라 할 때, anbn+an1bn1++a1b1+a0a_{n}b^{n} + a_{n-1} b^{n-1}+\dots+a_1 b^1+a_0입니다. 10진법 수 1234로 예를 들어볼까요?

bnb^na3a_3a2a_2a1a_1a0a_0
aia_i1234
aibna_ib^n1103=10001\cdot10^3 = 10002102=2002\cdot10^2 = 2003101=303\cdot10^1 = 304100=44\cdot10^0 = 4

모두 더하면 1234가 됩니다.

보다 쉽게 생각하면, 10진법에서는 흔히 1의 자리, 10의 자리와 같은 표현으로 자릿수를 말하곤 합니다. 따라서 다른 진법에서도 가장 작은 자릿수부터 b0b^0의 자리, b1b^1의 자리\cdots로 생각하면 보다 쉽게 이해할 수 있습니다.

bnb^n103=100010^3=1000의 자리102=10010^2=100의 자리101=1010^1=10의 자리100=110^0=1의 자리
aia_i1234
aibna_ib^n1000200304

이 글에서는 앞으로 밑이 bb인 수 xxxbx_b로 표기하겠습니다.

이진법

이진법은 0과 1만을 사용하는 진법입니다. 위의 예시와 같은 방식으로 이해할 수 있겠죠? 2진법 수 101121011_2를 위의 방식으로 나타내, 10진법으로 바꿔 봅시다.

bnb^n23=82^3=8의 자리22=42^2=4의 자리21=22^1=2의 자리20=12^0=1의 자리
aia_i1011
aibna_ib^n8021

모두 더하면 11이 됩니다. 따라서 10112=11101011_2=11_{10}입니다.

거꾸로 10진법 수를 2진법으로 바꿔 봅시다. 11을 다시 2진법으로 바꾸어 보겠습니다.

11=2(5)+1=215+1=21(2(2)+1)+1=222+211+1=22(2(1)+0)+211+1=231+220+211+1=10112\begin{align*} 11 &= 2(5) + 1 \\ &= 2^1 \cdot 5 + 1 \\ &= 2^1 \cdot (2(2) + 1) + 1 \\ &= 2^2 \cdot 2 + 2^1 \cdot 1 + 1 \\ &= 2^2 \cdot (2(1) + 0) + 2^1 \cdot 1 + 1 \\ &= 2^3 \cdot 1 + 2^2 \cdot 0 + 2^1 \cdot 1 + 1 \\ &= 1011_2 \end{align*}

bb로 몫이 0이 될 때까지 계속 나눠서 묶으면 bb진법으로 바꿀 수 있습니다. 이제 0을 포함한 자연수를 나타낼 수 있게 되었네요. [2]

컴퓨터에서 음수 표현

그런데 앞서 살펴본 방법은 0을 포함한 자연수만을 표현할 수 있습니다. 컴퓨터에서는 어떻게 음수를 표현할까요?

보수

먼저 보수에 대해 알아보고 넘어가야 합니다.

bb진법에서 보수는 b1b-1의 보수와 bb의 보수가 있습니다. nn자리 수 xxb1b-1의 보수는 bn1xb^n-1-x이고, bb의 보수는 bnxb^n-x입니다. 따라서 bb의 보수는 b1b-1의 보수에 1을 더한 값입니다. [3]

이 글에서는 8자리를 예시로 사용하겠습니다.

1의 보수

먼저 1의 보수를 음수로 생각해 봅시다.

11=00001011211=0000\:1011_2의 1의 보수를 먼저 계산해 봅시다. bn1=281=15=111111112b^n-1=2^8-1=15=1111\:1111_2이므로,

111111112000010112111101002\begin{align*} &1111&1111_2 \\ -&0000&1011_2 \\ \hline &1111&0100_2 \end{align*}

따라서 11=00001101211=0000\:1101_2의 1의 보수는 1111010021111\:0100_2, 즉 11=111101002-11=1111\:0100_2. 한편, 이는 각 자릿수의 부호를 뒤집은 것, 즉 NOT 연산을 한 것과 같습니다.

1의 보수를 실제로 음수로 사용할 수 있을지 1511=000011112+11110100215-11=0000\:1111_2+1111\:0100_2를 계산해 봅시다. 예상이 맞다면, 4=0000010024=0000\:0100_2가 나오겠죠?

000011112+1111010021000000112000000112+000000012(carry)000001002\begin{align*} &&0000&&1111_2& \\ &+&1111&&0100_2& \\ \hline &1&0000&&0011_2& \\ \\ &&0000&&0011_2& \\ &+&0000&&0001_2& \:\:\:\: \text{(carry)} \\ \hline &&0000&&0100_2& \end{align*}

원하는 결과가 나왔지만, 중간에 8자리가 넘어간 부분(carry)가 생기면 그것을 다시 더해줘야 하기 때문에 계산이 복잡해집니다. 거기에 0을 나타내는 표현이 2개(8자리라면 0=0000000020=0000\:0000_20=111111112-0=1111\:1111_2)가 생기는 문제도 있습니다. [4]

2의 보수

2의 보수를 사용하면 앞선 문제를 해결할 수 있습니다. 2의 보수는 1의 보수에 1을 더한 값입니다. 따라서 11=00001011211=0000\:1011_2의 2의 보수는 1111010121111\:0101_2입니다. 앞선 계산 151115-11을 다시 해 봅시다.

000011112+1111010121000001002\begin{align*} &&0000&&1111_2& \\ &+&1111&&0101_2& \\ \hline 1&&0000&&0100_2 \\ \end{align*}

8자리를 넘어가는 부분을 잘라내기면 하면 바로 원하는 값, 4=0000010024=0000\:0100_2가 나옵니다. 이처럼 2의 보수를 사용하면 덧셈이나 뺄셈에서 음수를 자연스럽게 표현할 수 있습니다. 0을 나타내는 표현도 0000000020000\:0000_2 하나만 있어서 비교가 쉽습니다. 이제 왜 컴퓨터에서 음수를 표현하는 데 2의 보수를 사용하는지 알 수 있겠죠?

정리

컴퓨터에서는 음수를 표현할 때 2의 보수를 사용합니다. 앞이 1로 시작하면 음수, 0으로 시작하면 음수로 볼 수 있겠죠. 추가로, 부호가 있는 nn비트 정수에서는 (2n1)-(2^{n-1})~2n12^n-1까지 표현할 수 있음을 알 수 있습니다. 예를 들어 부호 있는 8비트 정수는 128-128~127127까지 표현할 수 있습니다 (011111112=1270111\:1111_2=127, 100000002=1281000\:0000_2=-128).

오버플로

음수를 나타내는 방법을 알았으니, 이제 오버플로 현상도 더욱 잘 이해할 수 있겠습니다. 가장 큰 양수에서 1을 더하면 받아올림이 일어나며 부호가 바뀌고, 가장 작은 정수가 됩니다. 반대로 가장 작은 음수에 1을 빼도 가장 큰 양수가 되어버립니다. 8비트에서의 예를 볼까요?

011111112+000000012100000002100000002000000012011111112\begin{align*} &0111&1111_2& \\ +&0000&0001_2& \\ \hline &1000&0000_2& \\ \\ &1000&0000_2& \\ -&0000&0001_2& \\ \hline &0111&1111_2& \end{align*}

따라서 011111112+1=100000002=128,1000000021=011111112=1270111\:1111_2+1=1000\:0000_2=-128, 1000\:0000_2-1=0111\:1111_2=127이 되어버리는 이 현상을 오버플로라고 합니다.

부호 없는 정수

물론 부호 없는 정수에서도 오버플로는 발생합니다. 부호 없는 8비트 정수에서는 00~255255까지 표현할 수 있습니다. 여기서도 마찬가지 현상을 볼 수 있습니다. 255+1=111111112+000000012255+1=1111\:1111_2+0000\:0001_2을 봅시다.

111111112+0000000121000000002\begin{align*} &&1111&&1111_2& \\ &+&0000&&0001_2& \\ \hline &1&0000&&0000_2& \\ \end{align*}

8비트로 자르면 000000002=00000\:0000_2=0이 되어버립니다.

정리

오늘 내용을 간단히 정리해 봅시다.

  • 진법: 밑 bb에 따라 00 ~ (b1)(b-1)까지의 숫자를 사용, 가장 작은 자릿수부터 b0b^0의 자리, b1b^1의 자리\cdots로 수를 나타내는 법
  • 컴퓨터 → 2진법 사용
  • 컴퓨터 → 음수를 표현할 때 2의 보수를 사용 ∵ 자연스럽게 음수의 덧셈과 뺄셈을 나타낼 수 있음
    • 2의 보수: 비트를 뒤집고 1을 더한 값

참고 자료

  1. [1]
    Britannica, “Positional numeral system,” Britannica, https://www.britannica.com/science/positional-numeral-system. [Accessed 22 3 2025].
    [↑]
  2. [2]
    수학산책, “소수의 진법 변환,” NAVER 지식백과, https://terms.naver.com/entry.naver?docId=3572374&cid=58944&categoryId=58970. [Accessed 22 3 2025].
    [↑]
  3. [3]
    Wikipedia contributors, “Method of complements,” Wikipedia, The Free Encyclopedia, https://en.wikipedia.org/w/index.php?title=Method_of_complements&oldid=1278594637 [Accessed 22 3 2025].
    [↑]
  4. [4]
    Wikipedia contributors, “Ones’ complement,” Wikipedia, The Free Encyclopedia, https://en.wikipedia.org/w/index.php?title=Ones%27_complement&oldid=1229279233 [Accessed 22 3 2025].
    [↑]

용어

label
기수법
기호를 사용해 수를 표현하는 방법과 그 규칙
label
오버플로
Overflow; 연산 결과가 표현할 수 있는 범위를 넘어가는 현상

인용하기
BibTeX
@misc{devngho202520250322weeklycsintegersincomputers,
  author       = {Yu, Dongho},
  title        = {[1주1장 CS] 컴퓨터는 어떻게 자연수와 정수를 나타낼까?},
  howpublished = {\url{https://ngho.dev/posts/20250322-weekly-cs-integers-in-computers}},
  year         = {2025},
  month        = {mar},
  note         = {Accessed: 2025-03-23}
}

APA 유동호. (2025년 3월 22일). [1주1장 CS] 컴퓨터는 어떻게 자연수와 정수를 나타낼까?. devngho 블로그. https://ngho.dev/posts/20250322-weekly-cs-integers-in-computers

Chicago 유동호. “[1주1장 CS] 컴퓨터는 어떻게 자연수와 정수를 나타낼까?.” devngho 블로그, 2025년 3월 22일, https://ngho.dev/posts/20250322-weekly-cs-integers-in-computers.

MLA 유동호. “[1주1장 CS] 컴퓨터는 어떻게 자연수와 정수를 나타낼까?.” devngho 블로그, 2025년 3월 22일, https://ngho.dev/posts/20250322-weekly-cs-integers-in-computers.