부호가 없는 2진수의 뺄셈 연산에서 보수의 활용

디지털 장치의 대표적 예인 컴퓨터는 2진법의 수 체계를 사용한다. 만약 컴퓨터가 부호가 없는 2진수를 사용한다면, 컴퓨터에서 뺄셈 연산은 보수를 이용하는 것이 효율적이다. 먼저, 부호를 표시하지 않는 10진수에서 보수를 이용한 뺄셈 연산을 알아본다.

 

10진수 8 – 6 = 2 계산에서 8은 빼어지는 수로 피감수이고, 6은 빼는 수로 감수다. 감수를 10의 보수로 표현하면 뺄셈 연산은 덧셈 연산으로 대체할 수 있다. 6에 대한 10의 보수를 구해보자. 직접적으로 구할 수 있지만 먼저 9의 보수를 구하고 1을 더해서 10의 보수를 구하는 과정은 다음과 같다.

 

6일 때 9의 보수: (10-1)-6 = 3

6일 때 10의 보수: 3+1 = 4

 

구해진 10의 보수를 피감수 8과 더하면 다음과 같다.

 

8 + 4 = 12

 

구한 결과는 최상위 자리에서 자리 올림이 발생하여 10의 자리와 1의 자리로 구성된다. 여기서 10의 자리는 버리고 1의 자리만 취하면 원하는 값 2를 얻을 수 있다.

 

다른 예로 다음의 뺄셈 연산을 고려해보자.

 

2 – 4 = 2

 

이 경우는 감수가 피감수보다 큰 값이므로 결과는 음의 값이다. 그러나 부호를 표현할 수 없는 10진수이므로 구한 결과 2는 양의 값이 아니고 음의 값으로 간주한다. 감수 4일 때 9의 보수를 구하고 그 결과로부터 10의 보수를 구하는 과정은 다음과 같다.

 

4일 때 9의 보수: (10-1)-4 = 5

4일 때 10의 보수: 5+1 = 6

 

10의 보수를 피감수와 더해본다.

 

2 + 6 = 8

 

연산의 결과에서 자리 올림이 발생하지 않았다. 이때 얻은 연산 결과에 대한 10의 보수를 구해본다.

 

8일 때 9의 보수: (10-1)-8 = 1

8일 때 10의 보수: 1+1 = 2

 

10의 보수2는 실제로 음수 -2라는 것을 고려해야 한다.

 

10진법에서 보수를 이용한 뺄셈 연산을 부호가 없는 2진법에서도 적용해본다.

 


 

 

여기서도 뺄셈 연산은 덧셈 연산으로 대체된다. 먼저, 보수를 이용한 2진수 뺄셈의 결과가 최상위 자리에서 자리 올림이 발생하는 경우다.

 

1011 – 0100 = 0111

 

감수 0100일 때의 1의 보수를 구하고 그 결과에 0001을 더해서 2의 보수를 구하면 다음과 같다.

 

0100일 때 1의 보수: (10000 – 00001) – 0100 = 1111 – 0100 = 1011

0100일 때 2의 보수: 1011 + 0001 = 1100

 

구해진 2의 보수를 피감수와 더하면 다음의 결과를 얻는다.

 

1011 + 1100 = 10111

 

10진수에서와 마찬가지로 자리 올림으로 발생한 최상위 자리의 값을 버리고 나머지 값을 취하면 원래 뺄셈의 결과와 동일한 0111이 나온다.

 

다음으로 보수를 이용한 2진수 뺄셈의 결과가 최상위 자리에서 자리 올림이 발생하지 않는 경우다.

 

0111 – 1010 = 1100

 

이 경우 0111보다 1010이 더 큰수이므로 연산의 결과는 음수가 된다. 그러나 부호를 사용하지 않는 2진수이므로 단순 연산의 결과 값 1100은 음수의 의미를 포함하지 않으며, 절대적인 크기 값도 맞지 않는 답이다. 보수를 이용하여 정확한 연산의 결과를 구해본다.

 

감수 1010의 1일 때 보수를 구하고 그 결과에 0001을 더해서 2의 보수를 구하면 다음과 같다.

 

1010일 때 1의 보수: (10000-00001)-1010 = 1111-1010 = 0101

1010일 때 2의 보수: 0101 + 0001 = 0110

 

구해진 2의 보수를 피감수와 더하면 다음의 결과를 얻는다.

 

0111 + 0110 = 1101

 

10진수에서와 마찬가지로 최상위 자리에서 자리 올림이 발생하지 않은 경우에는 먼저, 얻어진 결과 1101일 때 2의 보수를 구한다.

 

1101일 때 1의 보수: (10000-00001)-1101 = 1111-1101 = 0010

1101일 때 2의 보수: 0010 + 0001 = 0011

 

연산 결과는 음의 값이나 부호가 없는 2진수이므로 0011이다. 그러나 (-)0011의 의미를 갖는다.

 

맞는지 검토하고자 10진수와 비교하면 다음과 같다.

 

(0111-1010 = -0011)2 ↔ (7 – 10 = -3)10

 

앞에서 구해진 2진수에서 1의 보수를 살펴볼 필요가 있다.

 

0100일 때 1의 보수: 1011

1010일 때 1의 보수: 0101

1101일 때 1의 보수: 0010

 

결과적으로 2진수에서 1의 보수는 각 자리마다 0→1 또는 1→0으로 비트를 반전하여 얻을 수 있다. 2진수의 뺄셈 연산은 다음처럼 진행된다.

 

① 감수의 비트를 반전하여 1의 보수를 구한다.

② 1의 보수에 1을 더해서 2의 보수를 구한다.

③ 피감수와 2의 보수를 더한다.

④ 최상위 자리에서 자리 올림이 발생하면 새로 생긴 최상위 자리를 버리고 나머지 자리의 값을 취한다.

⑤ 최상위 자리에서 자리 올림이 발생하지 않으면 덧셈 결과에 대한 2의 보수를 구한다. 그리고 음수 값으로 간주한다.

 

2진법의 뺄셈 과정에서 보수를 사용하면 덧셈 연산만으로 뺄셈 연산을 할 수 있다.

 


 

 

보수를 이용하여 뺄셈 연산을 수행하는 과정을 일반화해보자. r진수의 부호가 없는 두 n자리 수 사이의 뺄셈 M – N(where N is not 0)의 계산과정을 생각해보자. 빼어지는 수인 피감수 M에 빼는 수인 감수 N에 대한 r의 보수를 더한다. 그러면 동일한 뺄셈 연산이 된다.

 

M + (r^n – N) = M – N + r^n

 

여기서, M≥N이라면 위의 합은 자리 올림수 r^n을 만들고 이것을 무시하면 결과는 M – N이 된다. 그리고 M<N이라면 위의 합은 자리 올림수를 만들지 않고 그 값은 r^n – (N-M)이 된다. 이것은 (N-M)에 대한 r의 보수이므로 이것에 대한 r의 보수를 취하고 그 앞에 뺄셈 부호를 붙이면 결과를 얻을 수 있다.

Advertisements

보수(Complementary number)의 개념 – 보수의 정의

컴퓨터에서 보수는 음수를 표현하는 데 사용한다. 디지털 데이터에서 음수가 생소하게 느껴질 수 있지만, 작은 수에서 큰 수를 빼는 뺄셈 연산의 경우 음수가 필요하다. 이외의 많은 경우에 음수가 사용되며 음수의 표현은 중요하다.

1. 보수의 정의

보수(補數)의 어원적 의미는 ‘상호 보완하는 수’로, 임의의 수를 보완해주는 다른 임의의 수를 말하는 것이다. r진법에서 정의되는 보수(complementary number)는 두 종류다. 첫 번째는 (r-1)의 보수이고 두 번재는 진보수라고 하는 r의 보수다. 따라서 10진수에서는 9의 보수와 10의 보수가 존재하며, 2진수에서는 1의 보수와 2의 보수가 존재한다.

r진법에서 (r-1)의 보수는 A 수에 B 수를 더한 결과값의 각 자리가 (r-1)이 될 때, B를 A에 대한 (r-1)의 보수라고 정의한다. 10진수 (237)10 에 대한 9의 보수를 B라고 할 대 다음의 과정을 살펴보자.

237 + B = 999 → 237 + B = (1000-1) → B = (1000-1) – 237 = 762

다음으로 r진법에서 r의 보수는 A 수에 B 수를 더해서 각 자리마다 자리 올림이 발생하고 해당 자리는 0이 될 때, B를 A에 대한 r의 보수라고 정의한다. 계속해서 10진수 (237)10 에 대한 10의 보수를 B라고 하면 다음의 과정으로 구할 수 있다.

237 + B = 1000 → B = 1000 – 237 = 763

여러 진법에서 보수를 쉽게 구할 수 있도록 보수에 대한 정의를 수식으로 일반화한다.


r진수에서 (r-1)의 보수

r진법에서 임의의 정수 (N)r이 자릿수가 n개로 구성될 때, (r-1)의 보수 정의를 수식으로 표현하면 다음과 같다.

(r^n – 1) – N

10진수에서 9의 보수를 구해보자. 10^n은 1 하나와 뒤이은 n개의 0으로 구성되어 있고, 10^n – 1은 n개의 9로 구성된다. 따라서, 9의 보수는 각 자리의 숫자를 각각의 9에서 뺀 것과 같다.

2진수의 경우, r=2이므로 r-1=1이 된다. 그래서 N에 대한 1의 보수는 (2^n – 1) – N이다. 2진수에서 2^n은 1과 뒤이은 n개의 0으로 구성되어 있으며 2^n – 1은 n개의 1로 구성된다. 결과적으로, 2진수에 대한 1의 보수는 각 자리의 숫자를 각각의 1에서 뺀 것과 같다.


r진수에서 r의 보수

r진법에서 임의의 정수 (N)r이 자릿수가 n개로 구성될 때, r의 보수 정의를 수식으로 표현하면 다음과 같다. 여기서, N=0일 경우 0으로 정의된다.

r^n – N

r의 보수는 다음의 관계에 의해서 (r-1) 보수로부터 쉽게 얻을 수 있다.

r^n – N = [(r^n – 1) – N] +1

그래서 r의 보수는 (r-1)의 보수에 1을 더하면 된다.