티스토리 뷰

이론/Computer

2의 보수(two's complement)

미누시 2019. 11. 3. 23:54

이번 포스팅에서는 2의 보수에 대해서 알아보겠습니다. 먼저 보수란, '보충하는 수', '수를 거꾸로 세는 방식' 등을 의미합니다. 일반적으로 N진법에 대해서 N의 보수와 N-1의 보수가 존재하며 다음과 같습니다 :

  • N의 보수 : 자릿수를 한 자리 늘리기 위해서 필요한 보수.
    • 10진수 33의 10의 보수 : 100 - 33 = 67
  • N-1의 보수 : 같은 자릿수에서 가장 큰 값이 되기 위해 필요한 보수.
    • 10진수 33의 9의 보수 : 99 - 33 = 66

 

N진법에 대한 N의 보수 및 N-1의 보수는 아래에서 2진법에 대한 2의 보수 및 1의 보수로 연결되니 이해하시면 좋습니다.

 

 

 

컴퓨터의 음수 표현


우리가 음수를 표현할 때에는 - 부호를 선택함으로써 음수를 표기할 수 있습니다. 하지만, 0과 1로 구성된 컴퓨터에서 메모리에 음수를 표현하기 위해 -를 사용할 수 없기 때문에, 컴퓨터는 다른 방식으로 음수를 표현해야 합니다.

 

부호-크기 표현(Signed-magnitude representation)

이 방법은 2진수로 표현된 숫자의 가장 큰 자릿수 비트(MSB, most significant bit)를 부호를 표기하는데 사용합니다. 비트 하나를 부호의 표현에 사용하므로 부호를 사용하지 않는 수에 비해서 절반의 크기만큼만을 표현할 수 있습니다.

 

부호-크기 표현은 알아보기도 쉽고, 생성하기도 어렵지 않습니다. 하지만, 산술 연산이 단순하지 않은 문제가 있습니다. 이 단순한 방식에서 만약 2 - 2를 컴퓨터에서 수행하게 된다면, 0010(2) - 0010(2) = 0010(2) + 1010(-2)를 수행하게 되고, 1100(2) = -4라는 엉뚱한 답이 나옵니다(이를 해결하기 위해서 회로를 추가로 구성해야하며 쉬운 일이 아닙니다).

 

마찬가지로 산술 연산 뿐만이 아니라 음수의 비교 연산을 수행할 때도 모순이 발생합니다.

 

 

 

1의 보수(one's complement)


2진법의 1의 보수는 어떤 수를 커다란 2의 거듭제곱수 - 1에서 빼서 얻은 이진수입니다. 주어진 이진수와 자리수가 같고, 모든 자리가 1인 수에서 주어진 수를 빼서 1의 보수를 얻을 수도 있고, 이진수의 모든 자리 숫자를 반전시켜서 1의 보수를 얻을 수도 있습니다.

 

이 방식은 signed-magnitude방식에 부호와 수를 따로 계산하지 않아도 되고, 음수를 더하는 방식으로 뺼셈을 할 수 있게 됩니다. 가령, 2 - 2에 대해 0010(2) + 1101(-2) = 1111(0)과 같이 단순 덧셈만으로 값이 올바르게 산출됩니다. 하지만 여전히 양수 0과 음수 0 두 가지 방식으로 표현할 수 있는 문제가 있습니다. 이것을 해결하기 위해서는 음수 0에 대해 LSB(least significant bit)에 1을 더해주는 회로를 구성하여 양수 0으로 표현해야 합니다.

 

또한 캐리(carry)가 발생하면 LSB에 1을 더해줘야 합니다. 예를 들어 -2 + -3 = 1101 + 1100 = 1(carry 발생) 1001 + 0001(캐리 발생으로 인한 lsb에 1 추가) = 1010 = -5가 됩니다.

 

 

 

2의 보수


위키피디아에서는 2의 보수를 다음과 같이 설명하고 있습니다 :

2의 보수(two's complement) 란 어떤 수를 커다란 2의 제곱수에서 뻬서 얻은 이진수이다. 2의 보수는 대부분의 산술연산에서 원래 숫자의 음수처럼 취급된다. 주어진 이진수보다 한 자리 높고 가장 높은 자리가 1이며 나머지가 0인 수에서 주어진 수를 빼서 얻은 수가 2의 보수이다. 혹은 주어진 이진수의 모든 자리의 숫자를 반전(0을 1로, 1을 0으로)시킨 뒤, 여기에 1을 더하면 2의 보수를 얻을 수 있다.

 

2진법의 2의 보수는 1의 보수에서도 해결하지 못했던 0의 두 가지 표현을 해결한 방법입니다. 인용한 위키피디아의 설명에서 처럼 음수로 표현할 경우 비트 반전 이후, LSB에 1을 더하는 것으로 모든 문제를 해결할 수 있습니다. 가령 2 - 2 연산에 대해 0010(2) + 1110(-2) = 0000(0) 으로 완벽히 수행되고 있음을 확인할 수 있습니다.

 

또한 캐리가 발생했을 때 LSB에 1을 더해주지 않아도 결과가 정확합니다. 예를 들어, -2 + -3 = 1110(2) + 1101(2) = 1(carry 발생) 1011 = -5가 됩니다.

 

2의 보수 방식의 장점을 요약하면 다음과 같습니다 :

  • MSB가 0이면 양수, 1이면 음수임을 확신할 수 있음.
  • 음수를 더하는 방식으로 뺼셈 수행 가능
  • 음수의 비교연산에서 발생하는 모순 해결
  • 0이 단 한 가지 방식으로 표현 가능
  • 덧셈 및 뺄셈에서 캐리의 발생시 캐리를 처리하는 회로를 구성할 필요가 없음.

 

이러한 장점 때문에 오늘날의 컴퓨터의 대부분의 2의 보수 표현을 채택합니다.

 

 

 

레퍼런스


정보통신기술용어해설 - 보수 체계
제타우키 - 보수(complement)
appspot - 컴퓨터의 음수 표현
잉여인간의 블로그 - 보수 표현
위키피디아 - 1의 보수
crocus - 2의 보수, 보수를 이용한 값 구하기
dj.pe.kr - r의보수, r-1의 보수

'이론 > Computer' 카테고리의 다른 글

함수 호출 규약(Calling Convention)  (3) 2019.11.27
메모리 얼라인먼트(Memory Alignment)  (5) 2019.06.26
댓글