1의 보수와 2의 보수를 이해하자!
● 정수 표현
컴퓨터는 N개의 비트를 이용해 2^N개의 정수만 표현할 수 있습니다. 이러한 방식을 이용해서 수를 표현해야 하기 때문에 쉽지 않습니다. 또한 정수는 음의 정수와 양의 정수로 나누어지기 때문에 +, - 기호 또한 전부 비트로 표현을 해주어야 합니다. 하지만 정확히 어떠한 방식으로 이러한 정수를 표현할 수 있을까요? 그것을 알기 위해서는 보수의 개념을 이해하면 됩니다.
보수란, '두 수의 합이 진법의 밑수(N)가 되게 하는 수'를 말합니다. 예를 들어 10진수 4의 10의 보수는 6이고, 10진수 2의 10의 보수는 8입니다. 보수는 컴퓨터에서 음의 정수를 표현하기 위해서 고안되었습니다. 컴퓨터 내부에서는 사칙연산을 할 때 덧셈을 담당하는 가산기(Adder)만 이용하기 때문에 뺄셈은 덧셈으로 형식을 변환하여 계산해야 합니다. 즉 컴퓨터 내부에서는 A - B를 계산할 때 B의 보수(-B)를 구한 다음 A + (-B)로 계산하는 것입니다.
▶ 1의 보수 : 각 자릿수의 값이 모두 1인 수에서 주어진 2진수를 빼면 1의 보수를 얻을 수 있습니다.
예시 ) 2진수 1010의 1의 보수는 0101입니다.
▶ 2의 보수 : 1의 보수에 1을 더한 값과 같습니다.
예시 ) 2진수 1010에 대한 2의 보수를 구하려면 2진수 1010에 대한 1의 보수 0101을 구한 다음 1을 더해 0110을 얻습니다.
▶ 덧셈 : 기본적으로 2진수의 덧셈은 10진수의 덧셈과 계산하는 방식이 같습니다.
▶ 뺄셈 : 컴퓨터 내부에서는 덧셈만 가능하기 때문에 뺄셈은 보수를 이용해 덧셈으로 바꿉니다.
예시 ) 뺄셈 A - B는 B의 보수를 구한 다음 덧셈 A + (B의 보수)로 바꾸어 계산합니다.
- 1의 보수 뺄셈 : 1의 보수를 이용한 뺄셈은 빼는 수의 1의 보수를 구한 다음 더합니다. 덧셈한 결과가 최상위 비트에서 자리올림이 생겼다면 최하위 비트에 1을 더하고, 자리올림이 생기지 않았다면 연산 결과에 대해 1의 보수를 구한 후 - 부호를 붙입니다.
예시 ) 111(2) - 110(2) = 111(2) + 001(2) = 1000(2)에서 최상위 비트를 지우고 1을 더하므로 답은 1(2)입니다.
예시 ) 100(2) - 110(2) = 100(2) + 001(2) = 101(2)에서 다시 1의 보수를 취하므로 답은 10(2)입니다.
- 2의 보수 뺼셈 : 2의 보수를 이용한 뺄셈은 빼는 수의 2의 보수를 구한 다음 더합니다. 덧셈한 결과가 최상위 비트에서 자리 올림이 생겼다면 자리올림을 제외한 나머지 부분이 연산 결과이고, 자리 올림이 생기지 않았다면 연산 결과의 2의 보수를 구한 후 - 부호를 붙입니다.
예시 ) 111(2) - 110(2) = 111(2) + 010(2) = 1001(2)에서 최상위 비트를 지우므로 답은 1(2)입니다.
예시 ) 100(2) - 110(2) = 100(2) + 010(2) = 110(2)에서 답은 010(2)입니다.
▶ 곱셈 : 2진수의 곱셈을 하려면 부분 곱(Partial Product)을 이용합니다.
예시 ) 110011(2) X 110(2)은 다음과 같이 계산됩니다.
110011
X 110
-----------
000000
110011
110011
-----------
100110010
결과적으로 답은 100110010(2)입니다.
▶ 나눗셈 : 2진수의 나눗셈을 뺄셈으로 구현합니다.
예시 ) 100110(2) / 110(2)은 다음과 같이 계산됩니다.
110
110 ) 100110
-110
--------
111
-110
--------
10
결과적으로 몫은 110(2)이고 나머지는 10(2)입니다.
▶ 고정 소수점 표현 : 고정 소수점은 소수점이 고정된 위치에 있다는 의미입니다. 소수점이 왼쪽에 있다고 가정하면 소수를 나타내고 오른쪽에 있다고 가정하면 정수를 나타냅니다. 고정 소수점 방식은 용량이 제한적인 컴퓨터에서 매우 큰 수나 작은 수를 표현하기에는 한계가 있어서 정수를 표현할 때 주로 사용되고 있습니다.
부호(S)에 양의 정수는 0을 저장하고 음의 정수는 1을 저장합니다. 크기에는 정수 값을 2진수로 저장하면 됩니다.
고정 소수점 표현에는 음의 정수를 부호화 절댓값 방식, 1의 보수 방식, 2의 보수 방식을 사용하여 나타냅니다.
- 부호화 절댓값 방식 : 부호 비트 1과 2진수의 절댓값으로 나타냅니다.
- 1의 보수 방식 : 부호 비트 1과 2진수의 절댓값에 대한 1의 보수로 나타냅니다.
- 2의 보수 방식 : 부호 비트 1과 2진수의 절댓값에 대한 2의 보수로 나타냅니다.
양의 정수를 표현할 때는 3가지 방식 모두가 부호 비트에 0을 넣는 방식을 채택하지만, 음의 정수를 표현할 때는 제각각인 것입니다.
예시) 8비트로 양의 정수 +13과 음의 정수 -13을 나타내면 아래와 같습니다.
표현 방식 |
+13 |
-13 |
부호화 절댓값 |
0 0001101 |
1 0001101 |
1의 보수 |
0 0001101 |
1 1110010 |
2의 보수 |
0 0001101 |
1 1110011 |
또한 부호화 절댓값 방식과 절댓값 방식이 N비트로 표현할 수 있는 수의 범위는 -(2^N-1 - 1) ~ (2^N-1 - 1)입니다. 반면에 2의 보수 방식은 +0과 -0이 존재하는 부호화 절댓값 방식이나 1의 보수 방식과 달리 -0이 존재하지 않습니다. 즉 음의 정수를 하나 더 표현할 수 있어서 더욱 효율적이라고 할 수 있습니다. 따라서 2의 보수 방식으로 표현할 수 있는 수의 범위는 -2^N-1 ~ (2^N-1 - 1)입니다. 대부분의 컴퓨터에서는 2의 보수 방식을 사용합니다.
10진수 |
부호화 절댓값 |
1의 보수 |
2의 보수 |
-4 |
- |
- |
100 |
-3 |
111 |
100 |
101 |
-2 |
110 |
101 |
110 |
-1 |
101 |
110 |
111 |
-0 |
100 |
111 |
- |
+0 |
000 |
000 |
000 |
+1 |
001 |
001 |
001 |
+2 |
010 |
010 |
010 |
+3 |
011 |
011 |
011 |
'컴퓨터 기초' 카테고리의 다른 글
컴퓨터의 구조를 설명해줄게! (1) | 2016.06.08 |
---|---|
부동 소수점 방식이란? (2) | 2016.06.06 |
아스키코드와 유니코드에 대해서 알아보자! (0) | 2016.06.05 |
컴퓨터 진법을 정복해보자! (0) | 2016.06.05 |
컴퓨터의 역사에 대해서 알아보자! (81) | 2016.06.04 |