본문 바로가기
Language/Java

[Java]음수의 2진 표현 - 2의 보수

by 계범 2022. 2. 27.

컴퓨터에서의 음수 표현

컴퓨터는 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의 보수에 해당하는 결과가 나온다.

 

요약

  1. 컴퓨터는 덧셈으로만 계산한다.
  2. 뺄셈의 경우 보수를 이용한다.
  3. 컴퓨터는 2진법으로 되어있기에 2의 보수를 이용
  4. 2의 보수는 1의보수 +1
  5. 1의 보수를 구하는 방법은 해당 수의 비트를 반전시키는 것.
  6. 5 - 4의 경우 5 + (4의보수) 형태로 계산한다

 

참조

2022.01.14 - [Algorithm/개념] - [알고리즘 개념] 비트마스크(Bitmask)

'Java의 정석' 책

보다 자세한 참조 블로그

댓글