본문 바로가기

Programming/Study

보수에 대한 글 (1의 보수, 2의 보수, 9의 보수, 10의 보수)

찰스 펫졸드의 CODE 를 읽다가 보수에 대한 내용이 나왔는데, 의문이 드는 점이 있어서 정리해보았다.

책에선 잘 알고 있는 1의 보수, 2의 보수의 내용과 9의 보수, 10의 보수에 대한 내용이 나왔다. 책을 읽다보니 가장 먼저 든 궁금증은 "3의 보수, 4의 보수도 있는가" (질문1) 였다.

 

먼저 컴퓨터 전공한 사람이라면 1의 보수, 2의 보수의 개념은 잘 알고 있을 것이다.

 

1의 보수: 2진수에서 비트를 반전 시키면 얻는 값 (101010 -> 010101)

2의 보수: 1의 보수에서 1을 더한 값 (101010 -> 010101+1 = 010110)

 

책에선 이런 식으로 설명이 된다.

 

1의 보수: 2진수의 값을 1111..111 에서 빼면 나오는 값 (101010 -> 111111 - 101010 = 010101)

2의 보수: 1의 보수에서 1을 더한 값 (101010 -> 111111 - 010101 + 1 = 010110)

 

해당 논리로 9의 보수, 10의 보수가 설명된다.

 

9의 보수: 10진수의 값을 999...999 에서 빼면 나오는 값 (123456 -> 999999 - 123456 = 876543)

10의 보수: 9의 보수에서 1을 더한 값 (123456 -> 999999 - 123456 + 1 = 876544)

 

여기서 의문이 든 점은 "왜 더하기 1을 하면 다음 보수가 되냐" 였다.

지금 생각하면 말이 안 되지만 읽고 바로 든 생각은

1의 보수 + 1 = 2의 보수

2의 보수 + 1 = 3의 보수

...

9의 보수 + 1 = 10의 보수 라면

1의 보수 + 9 = 10의 보수 인가?

라는 의문이였다. (질문2)

 

위키피디아에서 1의 보수, 2의 보수를 찾아보았다.

 

1의 보수: 1의 보수란 어떤 수를 커다란 2의 거듭제곱수-1에서 빼서 얻은 이진수

2의 보수: 2의 보수란 어떤 수를 커다란 2의 제곱수에서 빼서 얻은 이진수

 

이걸 위의 정의와 정리하면 다음과 같이 될 것이다.

 

1의 보수: 어떤 수를 (2^n)-1 (=111..111) 에서 빼서 얻은 이진수

2의 보수: 어떤 수를 2^n 에서 뺴서 얻은 이진수

 

기존에는 2의 보수를 1의 보수에 종속적인 느낌으로 정의를 했는데 지금은 분리하였다.

왜냐하면 사실 둘은 큰 연관이 없는 개념이라는 게 필자의 결론이기 때문이다.

 

이제 결론이다.

우선 아까 적었던 두 가지 질문(1),(2)에 답은 (1)은 여러가지 보수가 있다 이고 (2)는 그렇지 않다 이다.

보수에 대해 수식적으로 정리해보면 아래와 같다.

 

- N의 보수: 어떤 수를 커다란 N^n 에서 빼서 얻은 N진수

- N-1의 보수: 어떤 수를 커다란 (N^n)-1 [(N-1)(N-1)(N-1)...(N-1)(N-1)(N-1)] 에서 빼서 얻은 N진수

 

이 정리대로면 자연수 N에 대해서 N의 보수는 총 2가지가 존재한다.

1. N진수의 N의 보수

2. N+1진수의 N의 보수

 

그래서 2의 보수도 2가지가 존재하게 된다.

1. 2진수의 2의 보수 (우리가 평소에 알던 2의 보수)

2. 3진수의 2의 보수 ( (3^n)-1 (=222...222) 에서 어떤 수를 빼서 얻은 삼진수)

 

결론적으로 1의 보수에 +1 을 하면 2의 보수가 된다는 건 다른 개념의 2가지의 값이 우연히 1이 차이가 난다는 걸로 설명한 좋지 못 한 설명이 되는 것 같고, 애초에 용어를 분리하는 게 맞지 않았나라고 생각한다.

 

숫자 7에 대하여 여러가지 보수들을 구해보자. (정확히 7은 아닌데 최대한 단순히 표현하기 위해 overflow와 자리수를 무시함)

1. 2진수

  1) 1의 보수: 111 - 111 = 000

    - 100 101 110 (111)000 001 010 011

  2) 2의 보수: 2^3(=1000) - 111 = 001

    - 100 101 110 111 000 001 010 011

2. 3진수 (11을 양수에 두는 게 맞는 지는 잘..)

  1) 2의 보수: 22 - 12 = 10

    - 12 20 21 (22)00 01 02 10 11

  2) 3의 보수: 3^2(=100) - 12 = 211

    - 12 20 21 22 00 01 02 10 11

3. 10진수

  1) 9의 보수: 9 - 7 = 2

    - 5 6 7 8 (9)0 1 2 3 4

  2) 10의 보수: 10^1(10) - 7 = 3

    - 5 6 7 8 9 0 1 2 3 4

 

다른 개념을 같은 형식의 용어를 사용해서 이런 혼동이 왔다고 생각해서 개인적인 대체 용어를 생각해보았다.

1의 보수 대체 용어: 2진수의 1의 보수, 1{N} 보수

2의 보수 대체 용어: 2진수의 2의 보수, 2^n 보수