컴퓨터에서의 음수 표현
컴퓨터는 2진수, 비트 단위가 최소단위로 값을 표현할 수 있는데 n 비트라고하면 표현할 수 있는 값의 개수는 2^n개이다.
만약 4비트의 2진수로 양수와 음수를 모두 표현한다고하면 어떻게 할까?
1) 절반씩 양수와 음수로 사용하여 순서대로 증가(부호 절대값 방식)
# | 2진수 | 부호있는 10진수 |
1 | 0000 | 0 |
2 | 0001 | 1 |
3 | 0010 | 2 |
4 | 0011 | 3 |
5 | 0100 | 4 |
6 | 0101 | 5 |
7 | 0110 | 6 |
8 | 0111 | 7 |
9 | 1000 | -0 |
10 | 1001 | -1 |
11 | 1010 | -2 |
12 | 1011 | -3 |
13 | 1100 | -4 |
14 | 1101 | -5 |
15 | 1110 | -6 |
16 | 1111 | -7 |
음수를 이렇게 배치하게 되면, 첫번째 비트만 1로 바꾸면 음수가 된다는 장점이 있다.
하지만, 두 수를 더했을 때 2진수로 0이 되지 않는다는 것과 0이 두개 존재한다는 단점이 있다.
5(0101) + -5(1101) = 0(0000)이 되어야하나, 10010이 되어 맨 앞자리가 떨어져나간다고해도 0010이 된다.
2) 2의 보수법
# | 2진수 | 부호있는 10진수 |
1 | 0000 | 0 |
2 | 0001 | 1 |
3 | 0010 | 2 |
4 | 0011 | 3 |
5 | 0100 | 4 |
6 | 0101 | 5 |
7 | 0110 | 6 |
8 | 0111 | 7 |
9 | 1000 | -8 |
10 | 1001 | -7 |
11 | 1010 | -6 |
12 | 1011 | -5 |
13 | 1100 | -4 |
14 | 1101 | -3 |
15 | 1110 | -2 |
16 | 1111 | -1 |
'2의 보수법'에 의해 음수를 배치하면, 절대값이 같은 양수와 음수를 더 했을때 2진수로도 0이라는 결과를 얻을 수 있다.
5(0101) + -5(1011) = 0 (2진수로 10000이여서 맨 앞자리는 4비트 넘어가서 지워지고 0000만 남음)
그리고 2진수가 증가할 때 10진 음수가 감소한다는 모순도 없어졌다.
N의 보수
보수는 보충해주는 수라는 뜻으로, 어떤수를 만들기 위해 필요한 수를 의미한다.
이러한 보수는 n진법마다 존재하는데, 각각의 n진법에서 n의 보수와 n-1의 보수가 쓰인다.
어떠한 수에대한 n의 보수는 더했을때 최대자리에서 올림이 발생하고 0이 되는 양수를 뜻한다.
10진법일때 2에 대한 10의 보수는 8이고, 2+8 = 10 = 올림처리된 1을 빼면 0
10진법일때 83에 대한 10의 보수는 17, 83+17 = 100
8진법일때 4에 대한 8의 보수는 4, 4 + 4 = 10⑻
8진법일때 17에 대한 8의 보수는 47, 21⑻ + 57⑻ = 100⑻
n-1의 보수는 (n의보수 -1)한 것이다.
위의식을 변환시키면 n 의보수 = n-1의보수+1 이라는 결과를 갖게 된다.
이러한 보수를 공부하는 이유는 컴퓨터는 덧셈만을 담당하는 가산기로 숫자 계산을 하는데,
보수를 이용하면 뺄셈 계산을 할 수 있다.
a - b 를 한다고 할때, b의 보수인 -b를 구하여 a + (-b) 형태로 진행한다.
2의 보수
컴퓨터는 비트(2진수)로 값을 표현하기때문에, 2의 보수를 통해 음수를 표현한다.
위에서 봤던, n의 보수 = n-1의 보수 +1 식을 통하면
2의 보수 = 1의 보수 +1 이 된다.
2진수의 어떠한 수에 대한 1의 보수는 각 비트를 변환시키면 바로 나온다.
0101(5) 의 1의 보수 - > 1010
1의보수 +1 = 1010 +1 = 1011
즉 5에 대한 2의 보수는 1011이 쉽게 구해진다.
(비트를 변환 시키면 1의 보수인 이유)
4비트
10진수 | 2진수 | 2의보수 | 2의보수 10진수 표현 | 2의보수 -1 = 1의보수 | (2의보수 -1)의 10진수 표현 |
1 | 0001 | 1111 | -1 | 1110 | -2 |
2 | 0010 | 1110 | -2 | 1101 | -3 |
3 | 0011 | 1101 | -3 | 1100 | -4 |
4 | 0100 | 1100 | -4 | 1011 | -5 |
5 | 0101 | 1011 | -5 | 1010 | -6 |
6 | 0110 | 1010 | -6 | 1001 | -7 |
7 | 0111 | 1001 | -7 | 1000 | -8 |
n진법에서 n-1의 보수는 n의보수 -1이라고 했다.
2진법에서 1의 보수는 2의보수 -1에 해당한다.
더해서 자리올림 수가 발생하게 되는 2의 보수를 구하고, 거기서 -1을 한 1의 보수를 적어놨다.
그다음 원래 수를 뜻하는 2진수와 1의 보수를 비교해보자.
원래 2진수에서 비트를 반전시키면 1의 보수에 해당하는 결과가 나온다.
요약
- 컴퓨터는 덧셈으로만 계산한다.
- 뺄셈의 경우 보수를 이용한다.
- 컴퓨터는 2진법으로 되어있기에 2의 보수를 이용
- 2의 보수는 1의보수 +1
- 1의 보수를 구하는 방법은 해당 수의 비트를 반전시키는 것.
- 5 - 4의 경우 5 + (4의보수) 형태로 계산한다
참조
2022.01.14 - [Algorithm/개념] - [알고리즘 개념] 비트마스크(Bitmask)
'Java의 정석' 책
'Language > Java' 카테고리의 다른 글
[Java] 기본형(Primitive Type) (0) | 2022.02.27 |
---|---|
[Java] 실수형의 정밀도, 고정소수점과 부동소수점 (0) | 2022.02.27 |
[Java] 진법 / 진법 변환(n진수 변환) /실수 진법변환 (0) | 2022.02.25 |
[Java] 형식화 출력 printf() & 입력값 받기 Scanner (0) | 2022.02.25 |
[Java] 기본형(Primitive type) & 상수와 리터럴(constant & literal) (0) | 2022.02.25 |
댓글