AiPE

보수(Complement)의 정의와 컴퓨터가 음수를 보수로 저장하는 이유 본문

[XiBBaL] Study/Java

보수(Complement)의 정의와 컴퓨터가 음수를 보수로 저장하는 이유

Oshimaker XiBBaL 2024. 3. 25. 21:02
반응형

1. 보수(Complement)의 정의

보수(Complement)의 정의를 먼저 알아보자.

우리가 "a의 N의 보수"라고 부르는 것은 어떠한 숫자 a가 있을 때 a+b=N을 만족하는 수 b를 일컫는 말이다.

예를 들어, 3의 10의 보수는 3+7=10이므로 7이다.

 

컴퓨터에서는 보수를 음수를 표현하는 데 사용한다.

컴퓨터는 기본적으로 덧셈의 연산만이 가능하기 때문에 뺄셈은 "음수를 더한다"라는 개념으로 접근한다.

 

컴퓨터는 2진수로 동작하므로 2진수와 관련된 <1의 보수>와 <2의 보수>만을 다루면 된다.

이진수에서 1과 2의 보수를 구하는 방법은 아래와 같다. 

 

 

2. 1의 보수를 구하는 방법

1의 보수를 구하는 방법은 굉장히 단순하다.

 

① 표현하고자 하는 수를 이진수 비트로 나타낸다.

Ex. 3을 4비트 이진수로 표현하면 `0011`이 된다.

 

② 모든 자리의 비트를 반대로 바꾼다.

Ex. 0011의 보수는 `1100`이다.

 

이게 1의 보수를 구하는 방법 전부이다. 굉장히 간단한 것을 볼 수 있다.

 

 

 

3. 2의 보수를 구하는 방법

2의 보수를 구하려면 가장 먼저 1의 보수를 구해야 한다. 이후 마지막 자리에 1을 더하는 것으로 2의 보수를 구한다.

 

① 표현하고자 하는 수를 이진수 비트로 나타낸다.

Ex. 3을 4비트 이진수로 표현하면 `0011`이 된다.

 

② 모든 자리의 비트를 반대로 바꾸어 1의 보수를 구한다.

Ex. 3의 1의 보수를 구하면 `1100`이 된다.

 

③ 구한 1의 보수 마지막 비트에 1을 더하고, 이후 비트에 대해 올림(Carry)를 수행한다.

Ex. `1100`의 마지막 비트에 1을 더해 `1101`이 된다. 이 숫자가 3의 2의 보수이다.

 

올림(Carry)란?
위의 예시로는 올림(Carry)의 계산법에 대해 정확하게 알 수 없다.
따라서 Carry가 발생하는 과정을 예시로 들어 Carry가 정확히 무엇인지 알아보자.

1. 숫자 '6'의 경우, 4비트 이진수로 표현하면 `0110`이다.

2. 6의 2의 보수를 구하기 위해 먼저 6의 1의 보수를 `1001`로 얻는다.

3. 6의 2의 보수를 구하기 위해 마지막 비트에 1을 더한다. 이 때 이미 그 자리에 1이 존재하므로 이를 올림하여 왼족에서 3번째 자리에 1을 적고, 마지막 자리를 0으로 한다.

4. 따라서 6의 2의 보수는 `1010`이다.

이진수에서의 Carry는, 우리가 십진수 덧셈 할 때 한 자리의 합이 10이 되면 하나 더 큰자리로 1을 올리듯, 합이 2가 되면 하나 더 큰 자리로 1을 올려주는 작업이다.

합이 10이 아닌, 2라는 것 이외에는 일반적인 십진수에서의 올림과 정확히 동일하다.

 

 

 

4. 음수를 보수로 저장했을 때의 장점

그렇다면 음수를 보수로 저장했을 때의 이득은 무엇일까?

음수를 보수로 저장했을 때의 장점
① 효율적인 뺄셈
보수를 사용하면 뺄셈 연산을 덧셈 연산으로 변환할 수 있다. 이는 하드웨어에서 덧셈 회로를 공유하여 구현하는 데 유리하다.


② 음수 표현의 단순화
보수를 사용하면 음수를 표현하는 데 추가적인 비트나 특별한 플래그를 사용하지 않고도 음수를 직관적으로 표현할 수 있습니다.

N비트 이진수에서 가장 처음 자리 (맨 왼쪽) 비트가 1일 경우 음수, 0일 경우 양수이다. 모든 자리의 비트를 살피지 않고도 부호를 판단할 수 있다.


③ 두 수 체계의 일관성
보수를 사용하면 양수와 음수를 동일한 방식으로 다룰 수 있다. 이는 컴퓨터 시스템에서 음수를 처리하기 유리하다.

 

간단하게 정리하자면, 컴퓨터에서 음수를 보수로 지정하는 이유는 뺄셈 연산을 간소화하고 음수를 효율적으로 표현하기 위함이다.

반응형