1. 음수의 2진 표현
n비트를 2진수로 표현하면 값의 개수는 총 2ⁿ개다. 4비트로 예를 들면, 4비트는 2⁴(=16) 개의 값을 표현할 수 있다. 이 값을 모두 '부호 없는 정수(0과 양수)'로 표현한다면 '0부터 15까지의 정수'를 나타낼 수 있다.
그럼 음수를 표현하려면 어떻게 해야 할까?
왼쪽의 첫 번째 비트(MSB)가
0이면 양수, 1이면 음수로 표현하자.
음수를 양수처럼 0처럼 순차적으로 채우게 되면 아래와 같은 문제가 발생한다.
1. 두 수를 더했을 때 2진수로 0이 되지 않는다.
2. 0이 두 개 존재(0, -0)
3. 2진수가 증가할 때 10진 음수는 감소
그러나, 아래와 같이 '2의 보수법'에 의해 음수를 배치하면 위의 언급한 문제들이 해결된다.
2. 2의 보수법
어떤 수의 'n의 보수'는 더했을 때 n이 되는 수를 말한다.
* ex) 7의 '10의 보수'는 3, 3의 '10의 보수'는 7
즉, '2의 보수 관계'에 있는 두 2진수는 더하여 '(자리올림이 발생하고) 0이 되는 수'이다.
0101 ← 10진수로 5
1011 ← 10진수로 -5
─────────
(1) 0000 ← 자리올림이 발생했으나 크기가 4 비트라서 버려짐
그럼 음수를 2진수로 표현하려면 어떻게 해야 할까?
2의 보수 = 1의 보수+1
0101 ← 10진수로 5
1010 ← 0101의 '1의 보수'
0001
────────────
1011 ← 10진수로 -5
* '1의 보수'는 0을 1로, 1을 0으로 바꾸는 것이다.
- 음수의 2진 표현을 구하는 방법
(1) 음수의 절댓값을 2진수로 변환한다.
: -5의 절댓값인 5를 2진수로 변환한다. 10진수 5를 2진수로 변환하면 '0101'이다.
(2) (1)에서 구한 2진수의 1을 0으로, 0은 1로 바꾼다.(1의 보수 구하기)
: '0101'이 '1010'이 된다.
(3) (2)의 결과에 1을 더한다.(2의 보수 구하기, 1의 보수+1)
: '1010'에 1을 더하면 '1011'이 되고, 이것이 -5의 2진 표현이다.
참고문헌 : 남궁성(2016), Java의 정석, 도우출판