1의 보수법, 2의 보수법을 정확히 이해해보자

c4fiber·2023년 6월 15일
1

feynman technique

목록 보기
1/2

보수와 보수법의 차이?

저는 2의 보수 와 2의 보수'법'을 구분해서 작성했습니다.

  1. 보수: A에 대한 B의 보수 C (A = B + C)
    • 보수를 취한다 == 해당 숫자의 값을 보수로 변경한다.
  2. 보수법: 각 기수의 수(digit)에 보수를 적용하여 표현하는 방법.

저는 번역과정에서 발생한 미묘한 차이라고 생각해서 보수/보수법 을 구분했습니다.

보수의 정의

보수(補數)는 보충을 해주는 수를 의미한다.

이를테면 1에 대한 10의 보수는 9
4에 대한 15의 보수는 11의 개념이다.
2에 대한 1의 보수는 1이다.

"A에 대한 B의 보수는 C 이다"는 "A = B + C 를 만족한다."

// 해당 내용은 차후에 설명할 여기 에서 설명하겠습니다.


기수법과 보수법

기수법

Numeral System : 우리가 흔히 사용하는 수의 표현법

  • 10진수의 13은 사실 1 10 + 3 1 이다.
  • 즉 기수의 거듭제곱을 위치를 이용해 나타낸다.
  • fixed-radix 와 mixed-radix로 나뉜다
    • fixed-radix: 10진수, 2진수 등 기수가 정해져 있다
    • mixed-radix: 날짜 및 시간(15일 21시 34분)처럼 각 숫자의 기수가 달라지는 경우

보수법

Complement Number System
기수법 중 fixed-radix를 이용한 숫자의 각 자리수에 보수를 취해서 표현하는 방법입니다.

보수법은 크게 두 가지로 나뉩니다.

  • N-1 보수법: Radix-Minus-One Complement(diminished radix complement)
    • 10진수: 각 자리의 숫자 d를 그의 보수로 교체한다 ((10 - 1) - d)
      • 0372에 9의 보수법을 취한 결과는 9627 이다.
    • 2진수: 각 자리의 숫자 d를 그의 보수로 교체한다. ((2 - 1) - d)
      • 0100에 1의 보수법을 취한 결과는 1011 이다.
      • 1100에 1의 보수법을 취한 결과는 0011 이다.
  • N 보수법: Radix Complement
    • 10진수: 9의 보수법을 취한 뒤 1을 더한다
    • 2진수: 1의 보수법을 취한 뒤 1을 더한다.

보수법을 설명하는 과정에서 기수법을 언급한 이유

기수(radix, base) 라는 개념을 알고가야합니다.
10진수는 radix = 10 / 2진수는 radix=2 이렇게 생각하시면 됩니다.

10진수 13523 이라는 숫자가 있을 때
이는 1 10^4 + 3 10^3 + 5 10^2 + 2 10^1 + 3 * 10^0 으로 표현이 되고

각 기수에 해당하는 숫자는 1, 3, 5, 2, 3 이므로
각각 보수를 취하면 9, 6, 4, 7, 6 이 되어
97476 이라는 숫자가 됩니다.
이 숫자는 13523 에 대해 9의 보수법을 취한 값 이죠


N과 N-1의 보수법(complement number system)

바로 위에서 계산한 결과를 바탕으로 생각해보자면

99,999 = 97,476 + 14,523 입니다.
99,999 = 100,000 - 1
즉 97,476은

99,999에 대한 14523의 보수 == 100,000 - 1에 대한 14523의 보수

양변에 1을 더해주면?
10^5에 대한 14523의 보수 97477이 됩니다.
즉 14523에 10(N)의 보수법을 취한 수가 되어

N의 보수법을 취한 수 == N-1의 보수법을 취한 수 + 1 이 됨을 알 수 있습니다.

10진법을 예로 들어볼게요 (N = 10)

  1. 숫자 23의 보수를 구하고 싶습니다.
  2. 그런데 보수를 구하려면 어떠한 숫자에 대한 보수를 구하는지 적어야하죠
  3. 이때 23보다 큰 10의 제곱수 중 가장 작은 수를 적용하는겁니다.
  4. 그럼 100에 대한 23의 보수를 구하는거죠

이 과정을 10의 보수법 이라고 이해했습니다.

2진법도 예로 들게요 (N = 2)

  1. 1001의 보수를 구하고 싶습니다.
  2. 어떠한 숫자에 대해 보수를 구할까요?
  3. 1001보다 큰 2의 제곱수중 가장 작은 수 10000 을 사용하는겁니다.
  4. 10000에 대한 1001의 보수 0111

이 과정을 2의 보수법 이라고 이해했습니다.

정리하자면

  1. 보수에 대한 정의: A에 대한 B의 보수 C
    • A = B + C
  2. N 또는 N-1의 보수법 내지는 보수표기법
    • 각 기수에 N 또는 N-1의 보수(1번)를 적용하여 표현하는 방법

이러한 이유로 저는 1의 보수, 2의보수를

1의 보수법, 2의 보수법 으로 분리해서 이해했습니다.

왜 보수를 사용하는가?

첫번째 이유는 가산기 레지스터 때문입니다.

컴퓨터에서 사칙연산은 모두 가산기를 이용해서 수행됩니다.

즉 덧셈을 이용해서 뺄셈을 수행해야 하기 때문에 보수 개념을 가져와 사용하는거죠.

두번째로는 양수,음수의 표현 때문입니다.

2진수로 저장된 숫자가 양수인지, 음수인지 판별하기 위해서 최상위 비트를 0 또는 1로 세팅합니다.

(이 비트를 MSB: most significant bit 라고 합니다.)

보수법을 사용하면 저장된 수의 절댓값을 쉽고 빠르게 확인할 수 있고

뺄셈을 수행할 때 도움이 됩니다.

  • 뺄셈을 수행하기 위해서는 절댓값이 큰 수를 앞에두고 덧셈연산을 수행해야 한다.

1의 보수법(one's complement / 1's complement)

기수 N=2라고 생각하고 N-1 보수법을 적용하면 됩니다.

각 자리의 숫자에 1의 보수를 취하기만 하면되죠

컴퓨터 연산으로는 NOT 연산이 됩니다.

덕분에 매우 간단하게 수행됩니다.

2진수 1001에 1의 보수법을 취하면 0110

2의 보수법(two's complement / 2's complement)

기수 N=2 라고 생각하고 N의 보수법을 적용하면 됩니다.

각 자리의 숫자에 1의 보수를 취한 뒤, 1을 더해줍니다.

2진수 1001에 2의 보수법을 취하면 0111

왜 컴퓨터는 2의 보수법를 사용하는가?

1의 보수를 사용하면 비트 전환만 수행하면 되기때문에 더 빠르고 효율적이라 생각이 든다

하지만 0을 표현하는 과정에서 문제가 생긴다

  • 0101 - 0101 -> 0101 + 1010 = 1111
  • 0000, 1111 두가지 모두 0을 표시하는 방법이 된다.

프로그램 코드 중에 두 값을 비교하는 과정이 있다면, 그 코드가 비트를 비교하는 방식이라면?

0000 == 1111

결과 값이 false로 나올 수 도 있고, 한쪽의 값을 보수를 취해서 같다는 것을 판별해야 하는 번거로운 상황이 발생할 수 있다.

하지만 2의 보수법을 사용한다면?

  • 0101 - 0101 -> 0101 + 1011 = 10000
  • 최상위 캐리비트 1을 저장하지 않고 버리면
  • 결과: 0000

후기

파인만 공부법 이라고 했던 방법이 떠올라서 작성해보았습니다.

리처드 파인만을 굉장히 좋아하는데

쉽게 설명할 수 없다면 이해한게 아니다 라는 부분이 정말 와닿았습니다.

2의 보수법을 사용하고, 어떻게 표현하는지는 알고있었지만

이 내용을 설명할 것이라고 생각하니 근거도 부족했고 알고있는 지식도 부족함을 깨닭았습니다.

폰 노이만이 제시했다고 알려진 2의 보수법 내지는 2의 보수 표기법을 찾아보려고 해도

제 검색능력으로는 원본이나 관련 논문을 찾기 어렵더라고요.

그래서 최대한 알 수 있는 내용을 기반으로 작성하고 쉽게 설명하려고 시도했습니다.

많은 분들에게 도움이 되면 좋겠습니다. 또 쉽게 이해되었으면 좋겠습니다.

감사합니다.

profile
amazing idiot

0개의 댓글