본문 바로가기
운영체제

이진 데이터 표현: 숫자

by oobw 2023. 10. 20.

컴퓨터는 이진 체계, 즉 0과 1만을 사용하여 모든 정보를 표현합니다. 이번 글에서는 복잡한 숫자 데이터가 이 이진 체계로 어떻게 표현되는지 깊게 살펴보겠습니다.

10진수(Decimal Numbers)

이진수를 살펴보기 전에, 우리가 편하게 사용하는 10진수 시스템을 먼저 알아보겠습니다. 10진수는 숫자의 해석과 표현을 해서 10진법을 사용합니다.

 

기본적인 10진수에서 모든 숫자는 10개의 고유 값(0-9) 중 하나를 나타냅니다. 9보다 큰 값을 저장하려면, 값을 왼쪽에 있는 다음 자릿수로 넘겨야 합니다. 예를 들면, 한 자리가 최댓값(9)에 도달했을 때 여기에 1을 더하면 결과는 두 자릿수가 되며 (9 + 1 = 10)입니다.

 

숫자에서 각 자리의 숫자는 해당 숫자가 전체 값에 어떤 중요성을 가지는지를 결정합니다. 숫자를 오른쪽에서 왼쪽으로 d₀, d₁, d₂ 등으로 표시한다면, 각 연속하는 자리의 숫자는 이전 자리보다 10배 더 큰 가중치를 가집니다. 예를 들어 8425를 살펴보면, 각 자리의 숫자는 10의 거듭제곱으로 가중치가 부여됩니다.

 

예제로 든 숫자 8425를 살펴보면, "1" 자리에 있는 5는 5(5 × 10^0)의 값을 가집니다. "10" 자리에 있는 2는 20(2 × 10^1)의 값을 가집니다. "백" 자리에 있는 4는 400(4 × 10^2)의 값을 기여하며, "천" 자리에 있는 8은 8000(8 × 10^3)의 값을 가집니다. 더 공식적으로 표현하면 8425는 다음과 같이 나타낼 수 있습니다:

(8 × 10^3) + (4 × 10^2) + (2 × 10^1) + (5 × 10^0)

 

10진수에서 적용되는 지수의 증가 패턴은 이를 10진수 체계라 부르는 이유입니다. d₀부터 시작해 오른쪽에서 왼쪽으로 숫자에 위치 번호를 할당하면, 각 숫자 dᵢ는 전체 값에 10^ᵢ를 기여하는 것을 의미합니다. 그러므로, N자리의 10진수의 전체 값은 다음과 같이 나타낼 수 있습니다:

(d_(N-1) × 10^(N-1)) + (d_(N-2) × 10^(N-2)) + … + (d₂ × 10^2) + (d₁ × 10^1) + (d₀ × 10^0)

부호 없는 이진수(Unsigned Numbers)

이진수 체계는 10진수의 밑수인 10 대신 2를 사용합니다. 우리가 방금 10진수에 대해 분석한 것과 동일한 방식으로 이진수를 살펴보면, 몇 가지 유사점을 발견할 수 있습니다. 여기서 중요한 점은 10을 2로 바꾼다는 것입니다.

 

기본 2의 체계에서 각 비트는 두 개의 가능한 값(0 또는 1) 중 하나를 저장합니다. 1보다 큰 값을 표현하기 위해서는 왼쪽에 추가적인 비트가 필요합니다. 예를 들어, 비트가 최대값인 1에서 시작하여 여기에 1을 더하면, 그 결과는 2비트(1 + 1 = 0b10)가 필요합니다. 이 패턴은 숫자 내의 모든 위치에 있는 비트에 동일하게 적용됩니다(예: 0b100100 + 0b100 = 0b101000).

 

숫자의 각 비트 위치는 그 비트가 전체 값에 얼마나 중요한지를 결정합니다. 숫자를 오른쪽에서 왼쪽으로 d₀, d₁, d₂ 등으로 나타낼 때, 각 연속하는 비트는 이전 비트보다 2배 더 큰 값을 가집니다.

 

이러한 관점에서 볼 때, 이진수로 연산하는 패턴은 10진수 연산과 유사하다는 것을 알 수 있습니다. 다시 말해, 단순히 값을 나열하고 필요한만큼 비트를 추가하면 됩니다. 본 섹션에서는 부호가 없는 숫자(즉, 0과 양수만을 포함하는)에 중점을 두었습니다. 그렇기 때문에, 0부터 시작하여 계산을 진행하는 것은 자연스럽습니다. 표 1은 이진수로 표현된 첫 번째 자연수들을 나타냅니다. 표에서 보듯, 이진수는 십진수보다 빠르게 자릿수가 늘어납니다. 이는 각 이진 비트(2개의 가능한 값)가 10진수(10개의 가능한 값) 보다 표현할 수 있는 정보가 더 적기 때문입니다.

 

표 1. 이진수와 십진수

이진수 십진수
0 0
1 1
10 2
11 3
100 4
101 5
…​ …​

이것은 십진수와 매우 유사하며, 이진수를 해석하는 공식도 거의 동일하게 적용됩니다. 단지 각 지수의 밑수인 10을 2로 변경하면 됩니다. 이 공식을 사용하면, 모든 이진수를 부호 없이 해석할 수 있습니다.

16진수(Hexadecimal)

지금까지 우리는 10진수와 2진수라는 두 가지 숫자 체계를 살펴보았습니다. 10진수는 우리 인간에게 친숙한 체계이기 때문에 주목할 만하며, 2진수는 데이터가 하드웨어에 저장되는 방식과 일치합니다. 두 체계의 표현력은 동일하다는 점을 유의해야 합니다. 한 체계에서 표현할 수 있는 숫자가 다른 체계에서는 표현할 수 없는 경우는 없습니다. 이런 점을 감안하면, 또 다른 숫자 체계인 16진수를 왜 논의하는지 궁금해질 수 있습니다.

 

이미 완벽한 두 가지 숫자 체계가 있다면, 왜 다른 체계가 필요한지 의문이 들 수 있습니다. 주된 이유는 편의성입니다. 표 1에 나타난 것처럼, 이진 비트 시퀀스는 길이가 길어지면서 복잡해집니다. 인간은 긴 0과 1의 시퀀스를 파악하는 데 어려움을 겪습니다. 반면 10진수는 간결하지만, 2진수와 직접적으로 매칭되지 않습니다.

 

10진수는 고정된 비트 수로 표현되는 값의 범위를 직관적으로 파악하기 어렵습니다. 예로, 오래된 컴퓨터가 16비트 메모리 주소를 사용한다고 할 때, 주소 범위는 0b0000000000000000부터 0b1111111111111111까지입니다. 10진수로는 0에서 65535까지입니다. 십진수 표현은 긴 이진수 시퀀스보다 간결하지만, 변환 과정을 고려하지 않으면 십진수로의 추론이 복잡해집니다. 32비트나 64비트 주소를 사용하는 현대 장치에서 이 문제는 더욱 복잡해집니다.

 

긴 비트 시퀀스를 간결하게 표현하는 데 있어 16진수의 밑수 16이 유용합니다. 큰 밑수를 사용함으로써 16진수로 간단하게 표현할 수 있게 됩니다. 2의 거듭제곱인 2^4 =16 때문에 16진수를 2진수로, 또는 그 반대로 변환하는 것은 매우 간단합니다.

 

16진수는 16개의 고유값을 갖는 숫자로 구성됩니다. 10보다 큰 값은 16진수의 특별한 표기법을 필요로 합니다. 일반적인 10진수에서는 최대 9까지의 숫자만 사용하지만, 16진수에서는 A(10), B(11)부터 F(15)까지의 문자를 사용합니다. 15보다 큰 값을 표현하기 위해서는 더 많은 자릿수가 필요합니다. 예를 들면, 한 자리의 최댓값인 F에 1을 더하면 두 자릿수가 되는 0x10이 됩니다(16진수는 앞에 '0x'를 붙여서 표기합니다).