저는 2의 보수 와 2의 보수'법'을 구분해서 작성했습니다.
저는 번역과정에서 발생한 미묘한 차이라고 생각해서 보수/보수법 을 구분했습니다.
보수(補數)는 보충을 해주는 수를 의미한다.
이를테면 1에 대한 10의 보수는 9
4에 대한 15의 보수는 11의 개념이다.
2에 대한 1의 보수는 1이다.
"A에 대한 B의 보수는 C 이다"는 "A = B + C 를 만족한다."
// 해당 내용은 차후에 설명할 여기 에서 설명하겠습니다.
Numeral System : 우리가 흔히 사용하는 수의 표현법
Complement Number System
기수법 중 fixed-radix를 이용한 숫자의 각 자리수에 보수를 취해서 표현하는 방법입니다.
보수법은 크게 두 가지로 나뉩니다.
기수(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의 보수법을 취한 값 이죠
바로 위에서 계산한 결과를 바탕으로 생각해보자면
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)
이 과정을 10의 보수법 이라고 이해했습니다.
2진법도 예로 들게요 (N = 2)
이 과정을 2의 보수법 이라고 이해했습니다.
정리하자면
이러한 이유로 저는 1의 보수, 2의보수를
1의 보수법, 2의 보수법 으로 분리해서 이해했습니다.
첫번째 이유는 가산기 레지스터 때문입니다.
컴퓨터에서 사칙연산은 모두 가산기를 이용해서 수행됩니다.
즉 덧셈을 이용해서 뺄셈을 수행해야 하기 때문에 보수 개념을 가져와 사용하는거죠.
두번째로는 양수,음수의 표현 때문입니다.
2진수로 저장된 숫자가 양수인지, 음수인지 판별하기 위해서 최상위 비트를 0 또는 1로 세팅합니다.
(이 비트를 MSB: most significant bit 라고 합니다.)
보수법을 사용하면 저장된 수의 절댓값을 쉽고 빠르게 확인할 수 있고
뺄셈을 수행할 때 도움이 됩니다.
기수 N=2라고 생각하고 N-1 보수법을 적용하면 됩니다.
각 자리의 숫자에 1의 보수를 취하기만 하면되죠
컴퓨터 연산으로는 NOT 연산이 됩니다.
덕분에 매우 간단하게 수행됩니다.
2진수 1001에 1의 보수법을 취하면 0110
기수 N=2 라고 생각하고 N의 보수법을 적용하면 됩니다.
각 자리의 숫자에 1의 보수를 취한 뒤, 1을 더해줍니다.
2진수 1001에 2의 보수법을 취하면 0111
1의 보수를 사용하면 비트 전환만 수행하면 되기때문에 더 빠르고 효율적이라 생각이 든다
하지만 0을 표현하는 과정에서 문제가 생긴다
프로그램 코드 중에 두 값을 비교하는 과정이 있다면, 그 코드가 비트를 비교하는 방식이라면?
0000 == 1111
결과 값이 false로 나올 수 도 있고, 한쪽의 값을 보수를 취해서 같다는 것을 판별해야 하는 번거로운 상황이 발생할 수 있다.
하지만 2의 보수법을 사용한다면?
파인만 공부법 이라고 했던 방법이 떠올라서 작성해보았습니다.
리처드 파인만을 굉장히 좋아하는데
쉽게 설명할 수 없다면 이해한게 아니다 라는 부분이 정말 와닿았습니다.
2의 보수법을 사용하고, 어떻게 표현하는지는 알고있었지만
이 내용을 설명할 것이라고 생각하니 근거도 부족했고 알고있는 지식도 부족함을 깨닭았습니다.
폰 노이만이 제시했다고 알려진 2의 보수법 내지는 2의 보수 표기법을 찾아보려고 해도
제 검색능력으로는 원본이나 관련 논문을 찾기 어렵더라고요.
그래서 최대한 알 수 있는 내용을 기반으로 작성하고 쉽게 설명하려고 시도했습니다.
많은 분들에게 도움이 되면 좋겠습니다. 또 쉽게 이해되었으면 좋겠습니다.
감사합니다.