가끔 자바관련 궁금증을 풀기위해 들어가본 블로그에서 '2의 보수'에대한 글을 몇번 본적이 있다.
이제 2진법도 알겠다, 자신감있게 글을 정독하려고 눈에 힘준적이 몇번 있었지만 몇분 안되어 그만두고 말았다
왜 음수를 2의 보수로 표현하는걸까.. 10에대한 3의 보수가 7인가 3에대한 10의 보수가 7인가..
뭐가 뭔지도 모르던 차에 지인이 너무 설명을 잘해주셔서 다른 설명과 함께 보수와 비트단위 논리연산자에대해 정리해보았다.
보수는 보충을 하는 수를 의미한다
모든 n진수에는 보수가 있다.
그리고 n진수의 보수에는 'n의 보수'와 'n-1의 보수'가 있다
먼저 n-1의 보수는 각 자리 값에서 가장 큰 값이 되기위해 보충해야하는 수를 말한다.
예를 들어 10진수의 각자리값에서 가장 큰 값은 9다. +1이 되면 자릿수 올림이 되어서 0이 되어버리니까.
그러니 10진수 23의 9의 보수는 76이다.
76이라면 23의 각자리수를 보충하여 99로 만들어버린다.
그럼 n진수에서 n의 보수는 무엇일까? 쉽게 말하면 n-1의 보수에 1을 더한 값이다. 또 다르게 말하면 자릿수를 늘리기위해(자리올림) 보충해야하는 수라고 할 수 있다.
예를 들어 23(10)📍 의 9의 보수인 76에 + 1을 하면 77로, 23을 100으로 만드는 수가 된다! 2자리수를 3자리수로 늘리는 수, 즉 23(10)의 10의 보수는 77이라고 할 수 있다.
이해가 안되면 또 다른 예가 있다
2진수 1010의 2의 보수는 0110이다. 1의 보수 0101 + 1이 0110이며, 1010 + 0110은 10000으로, 자리수를 늘리기 때문이다.
📍23(10) : 10진수라는 의미 1010(2)는 이진수 숫자
보통 숫자에서 음수를 나타낼 때 앞에 -를 붙인다.
하지만 2진수(01011010100..)를 사용하는 컴퓨터는 -가 아닌 2진수로 나타낸 숫자 데이터의 가장 앞자리 bit를 음수, 양수를 표기하는데 사용한다.맨 앞자리가 0이면 양수, 1이면 음수다.
2의 보수를 다시 한 번 보자.
4bit 2진수 1010과 1010의 2의 보수는 0110을 더하면 0000이다. (10000이지만 4bit이라 맨 왼쪽 bit는 무시된다)
대체로 2의 보수법을 n bit 숫자에 적용하면 x + (-x)는 늘 2의 n제곱이 되며 맨 왼쪽의 bit를 무시하면 0(n개의 0)이 된다.
그렇기 때문에 x의 2의 보수를 -x로 사용할 수 있는 것이다.
~
맨 앞 bit가 부호를 나타내는데 사용되기 때문에, 4 bit로는 -8 ~ 8 범위의 수만 표현할 수 있다.
참고한 블로그와 책
감사합니다