컴퓨터에서 부호 있는 수를 표현하는 방법 중 부호 비트(Most Significant Bit ; MSB)라는 방법이 있다. 맨 앞에 양수는 0, 음수는 1을 추가하는 방식이다.
8 비트로 양수 5를 표현하면 다음과 같다.
00000101
8 비트로 음수 5를 표현하면 다음과 같다.
10000101
문제는 이 둘을 더하면 0이 되지 않고 10001010이 된다. 맨 앞이 MSB라고 한다면 이 값은 -10이다.
이를 해결하기 위해 컴퓨터에서 음수는 단순히 부호를 바꿔 표현하지 않고 ‘보수’라는 방법으로 표현한다. 예를들면, 10진법에서 어떤 미지의 수 x가 있을 때, 3에 대한 x의 보수는 x-3이 된다. 만일 x가 10이라면 3의 보수는 7이 되고, x가 26이라면 3의 보수는 23이 된다.
이제 이 개념을 2진수에 적용해 더해서 0이 나오는 관계를 찾아보자. 2진수에서 2의 보수는 더해서 10이 되는 수이다. 11의 보수는 1이라고 한다면 11 + 1 = 100이 되는데 우리가 2비트만 사용 한다면, 맨 왼쪽 숫자를 탈락시켜 결과를 0으로 만들 수 있다. 4비트 예시를 살펴보자. 0011에 대한 2의 보수를 찾으려면 10000이 되게 해야 한다. 10000 - 0011 = 1101이다. 즉 0011의 보수는 1101이다.
우리가 보수를 구할 때는 두 숫자를 그냥 빼면 된다. 컴퓨터에서는 어떻게 구해야 하는가? 우리가 가진건 논리 게이트 뿐이다. 1을 0으로, 0을 1로 바꾸기만 해서 찾아내야 한다. 그러므로 우리는 1의 보수를 먼저 구해야 한다.
8비트 숫자 00000101이 있다. 이 숫자의 1의 보수는 11111111이다. 0을 1로, 1을 0으로 바꿔주기만 하면 된다. 따라서 11111010이 된다.
우리의 목표는 0을 구하는 것이다. 11111111을 0으로 만드려면 1만 더해주면 된다. 100000000를 만들고 맨 왼쪽 1을 탈락 시키면 0이 된다. 따라서 보수 11111010에 1을 더한 수 11111011을 처음 수에 더하면 우리가 원하는 결과인 0을 얻을 수 있다. 이것이 컴퓨터에서 음수를 구하는 방법이다.
따라서 10진수 양수 5를 2진수로 표현하면
00000101
으로 전과 같지만, 음수 5를 2진수로 표현하면
11111011
이 된다. 이 둘을 더하면 100000000가 되는데 우리는 8비트를 사용하기로 했으므로 맨 왼쪽 1이 탈락되어 0만 남게 된다. 결과적으로 두 수를 더해서 0이 되는 연산에 성공한 것이다.