2의 보수법 (two's complement)

bolee·2022년 3월 29일
1

컴퓨터는 1과 0으로 되어있다.
그렇기 때문에 음수를 표현하기 위해서 컴퓨터는 2의 보수법을 사용한다.

보수

보수(complement)는 보충해주는 수이라는 뜻이다.

예를 들어 10진수 10이 있을때, 4의 보수를 구하라고 하면 4를 더해서 10이 되는 숫자인 6이 '10에 대한 4의 보수'이다.
즉, N이 있을때, N의 '2의 보수'를 구하라고 하면 다 더해서 2가 되는 숫자인 '어떤 수'가 보수인 것이다.
이를 이용해 컴퓨터에서는 2의 보수(two's complement)를 사용하여 음수를 나타낸다.

2의 보수를 이용한 음수 표현

컴퓨터에서는 2진수이기 때문에 각 비트(자리)가 더해서 2가 되는 보수를 이용하여 음수를 표현할 수 있다.

이를 4비트 기준으로 살펴보자

	0001 
+	1111
------------
   10000

위에처럼 0001의 각 비트가 2가 되게하는 보수 1111을 더하게 되면 10000으로 바뀌는데 4비트를 기준으로 하였기 때문에 맨 왼쪽 비트(첫번째 비트)는 무시된다. (truncate, CPU의 비트 제한으로 비트 범위 벗어나면 버린다.)

이로 인해 두 수('어떤 수'와 '어떤 수의 보수')의 합은 0이 되고, 다시 말하면 '어떤 수의 보수'는 '어떤 수'의 음수처럼 작용한다는 것이다.

2의 보수 구하기

2의 보수를 구하는 과정은 아래와 같다.

1. 1의 보수 구하기

2의 보수를 구하기 위해서는 1의 보수를 만들어야한다.
1의 보수란, 각 비트(자리)가 더해서 1가 되는 보수를 말한다.

예를 들어 10진수 7의 2의 보수를 만들어보면 최대 비트 수가 8일 때 7의 2진수은 아래와 같다.

7(10) = 00000111(2)

이를 이용해 7의 1의 보수를 구하면 7의 2진수를 0을 1로, 1을 0으로 반전시키면 된다.
7의 2진수를 반전시키면 아래와 같다.

11111000

c 언어에서는 NOT 연산자(~)를 이용하면 된다.

2. 가장 낮은 비트에 1 더하기

이제 위에서 1의 보수법을 통해 구한 2진수에 1을 더하면 2의 보수가 구해진다.

	11111000
+ 	00000001
---------------
	11111001

3. 2의 보수 확인

만들어진 2의 보수가 맞는지 확인하기 위해 7의 2진수 표현과 구한 2의 보수를 더하면 된다.
두 수를 더해서 최대 비트 수를 넘어선 수를 제외한 비트들이 10진수로 0이 되면 잘 구해진 것이다.

	00000111 
+	11111001
----------------
   100000000
  
// 최대 비트 수를 넘어가는 가장 왼쪽 1제외 -> 00000000

100000000에서 최대 비트수 8을 넘어서는 가장 왼쪽 비트를 제외하면 00000000이 되고 이는 10진수로 0이므로 2의 보수로 구한 값이 잘 구해졌음이 확인되었다.

참고: https://life-with-coding.tistory.com/298

0개의 댓글