부호가 없는 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

글쓴이: Hong Jin-Seob

Developer

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중