본문 바로가기

기타

[CS] 1의 보수법과 2의 보수법

사람과 사람의 의사소통 하기 위해서는 그들이 사용하는 언어가 같아야하듯 프로그래머가 컴퓨터와 의사소통하기 위해서는 컴퓨터가 사용하는 언어를 알아야합니다. 한글은 24자의 자음과 모음이 영어는 26개의 알파벳이 있어 이들의 조합으로 무수히 많은 조합을 만들어 낼수 있지만 컴퓨터는 0과 1만을 사용해 정수의 부호와 크기를 표현해야 하기 때문에 비효율적인 방법으로 조합을 짜면 비용이 낭비 됩니다. 

 

컴퓨터의 언어로 정수를 효율적으로 표현하기 위해서는 보수라는 개념을 먼저 알고가야 합니다. 보수란, '두 수의 합이 진법의 밑수(N)가 되게 하는 수'를 말합니다. 예를 들어 10진수 4의 10의 보수는 6이고, 10진수 2의 10의 보수는 8입니다. 보수는 컴퓨터에서 음의 정수를 표현하기 위해서 고안되었습니다.

1의 보수

음수를 표현하는 방법으로는 양수의 모든 비트를 뒤집는 방법이 있는데 이를 1의 보수 표현법이라고 부릅니다. 아래 표를 보면 0111(+7)의 각 비트를 뒤집으면 1000(-7)을 얻을 수 있음을 알 수 있습니다. 여기서 뒤집는 다는 말은 1 -> 0, 0 -> 1로 변환한다는 말로 NOT연산을 수행하는 것을 의미합니다.

부호 2⁰ 10진수
0 1 1 1 +7
0 1 1 0 +6
0 1 0 1 +5
0 1 0 0 +4
0 0 1 1 +3
0 0 1 0 +2
0 0 0 1 +1
0 0 0 0 +0
1 1 1 1 -0
1 1 1 0 -1
1 1 0 1 -2
1 1 0 0 -3
1 0 1 1 -4
1 0 1 0 -5
1 0 0 1 -6
1 0 0 0 -7

1의 보수법으로 +2(0010)와 -1(1110)을 더하면 MSB(가장 왼쪽 값)에서 올림이 발생하여 LSB(가장 오른쪽 값)로 올림을 전달하게 되는데 이를 순환 올림(end-around carry)라고 부르며 다음과 같이 표현할수 있습니다.

          10진수
  0 0 1 0 +2
+ 1 1 1 0 -1
= 0 0 0 1 +1

1의 보수법의 경우 잘 작동하기는 하지만 0을 두 가지 방식으로 표현하기 때문에 비용이 낭비되고 덧셈 과정에서 순환 올림을 처리하기 위한 하드웨어를 추가해야 하기 때문에 현대 컴퓨터에서는 잘 사용하지 않습니다.

 

2의 보수

특별한 하드웨어를 추가하지 않고 효율적인 방법으로 정수를 표현하려면 어떻게 해야 할까요? 그래서 나온 방법이 바로 2의 보수 표현법입니다. 1의 보수와는 달리 2의 보수에서는 MSB(가장 왼쪽 값)에서 올림이 발생하면 LSB(가장 오른쪽 값)으로 올림을 전달하지 않고 그냥 버립니다. 그리고 어떤 수(N)의 비트를 NOT연산을 취해 전부 뒤집고 1을 더하면 N의 음수를 얻을 수 있습니다. 예를 들어서 0001(+1)을 전부 뒤집은 값 1110에 1을 더하게 되면 1111이 되고 이를 -1로 사용합니다. 비슷하게 0010(+2)를 전부 뒤집으면 1101이고 여기에 1을 더한값 1110을 -2로 사용합니다. 

부호 2⁰ 10진수
0 1 1 1 +7
0 1 1 0 +6
0 1 0 1 +5
0 1 0 0 +4
0 0 1 1 +3
0 0 1 0 +2
0 0 0 1 +1
0 0 0 0 +0
1 1 1 1 -1
1 1 1 0 -2
1 1 0 1 -3
1 1 0 0 -4
1 0 1 1 -5
1 0 1 0 -6
1 0 0 1 -7
1 0 0 0 -8

위 표를 보면 2의 보수법으로 정수를 표현했을때 0이 중복 표현되지도 않고 추가로 하드웨어를 구현하지 않아도 덧셈을 쉽게 할수 있다는 것을 알수 있습니다.

 

출처: https://ndb796.tistory.com/4 [안경잡이개발자]