본문 바로가기

Java/Chapter 02. 변수와 자료형

[Java] 02.02 - 정수의 표현 방식 이해하기

들어가며

 앞서 double형 변수 둘을
대상으로 한 덧셈의 결과에

 오차가 있는 것을 확인하였다.

 이러한 오차의 발생 이유를
알기 위해서는

 컴퓨터의 정수, 실수 표현법을
이해해야 한다.

 따라서 이에 대하여 간단히
설명하고자 한다.

 참고로 본문에서는 2진수와
8,16진수에 대한

 기본적인 이해를 갖추었다고
가정하고 진행한다.

 

컴퓨터가 정수를 이해하는 방식

 정수의 표현에 있어 제일
먼저 결정할 사항은

 '몇 바이트 정수로 표현할
것인가.'이다.

 정수는 1, 2, 8바이트로도
표현할 수 있다.

 물론 표현하는 바이트 크기가
클수록

 표현할 수 있는 정수의 범위는
넓어진다.

 그러나 값을 표현하는 기본
원리는 동일하므로

 설명의 편의를 위해서 1바이트
기준으로

 정수의 표현 방식을 설명하겠다.

 다음의 그림은 정수 표현의
기본 원리를 보여준다.

그림 11 - 양의 정수 표현 방식

 위 그림이 보여주듯이,

 가장 왼쪽에 위치한 비트는
부호를 나타낸다.

 이 부호 비트가 0이면 양수를,
1이면 음수를 의미한다.

 그리고 이 비트가 0인경우,
나머지 7개의 비트는

 데이터의 양적인 크기를
의미힌다.

 즉, 위 그림의 경우에는
나머지 7개의 비트가

 0011001이므로, 값은 25이다.

 실제로 컴퓨터의 데이터 표현
방식 중에서는

 양의 정수 표현이 제일 간단하다.

MSB (Most Significant Bit)

 부호를 결정짓는 가장 왼쪽에 위치한
비트를 가리켜 'MSB'라고 한다.

 그런데 이 비트에 따라서 값의 부호만
달라지는 것이 아니라,

 나머지 비트의 해석 방법도
달라진다.

 즉, 이 비트가 0일 때 나머지 비트를
해석하는 방법과

 이 비트가 1일 때 나머지 비트를
해석하는 방법이 다르다.

 

 음의 정수를 표현하는 방식

 양의 정수를 표현하는 방식을
생각하면서

 음의 정수를 푶현하는 방식도
유사할 거라고 생각할 수 있다.

 즉, 다음과 같이 생각할 가능성이
높다.

  • 부호 비트가 1이면 음의 정수 아니냐?
  • ㄹㅇ 그럼 나머지 비트도 크기를 나타내는 거 아님?

 이는 다음과 같은 이해와 추론의
과정을 거쳐서 도출되었을 것이다.

  • 음의 정수 '-1'의 가장 왼쪽 비트는 '1'이다.
  • 음의 정수 '-1'의 부호를 제외한 데이터의 크기는 1이므로
    나머지 비트는 0000001이다.
  • 따라서 '-1'을 1바이트로 표현하면 '10000001'이다.

 꽤나 합리적인 추론이지만,
어림도 없다.

 이러한 연산 방식에는
큰 어려움이 있다.

1 + (-1) = 0

 10진수 말고 2진수로 변환하면
다음과 같다.

0000 0001 + 1000 0001 = ?

 위의 두 이진수의 단순 덧셈
결과는 다음과 같다.

 그리고 이 결과는 어떠한 방식으로
해석하든, 0이 될 수 없다.

202 = 1000 0010 ≠ 0

 위의 연산을 통해서 앞서
우리가 생각한

 음의 정수를 표현하는 방식이
적절치 않음을 알 수 있다.

 그렇다면, 음의 정수를 어떻게
표현해야

 잘 표현했다고 소문이 날까.

 결론부터 박고 들어가면,
다음과 같다.

양의 정수의 이진수 표현에 2의 보수를
취한 결과를 음의 정수로 표현한다.

 예를 들어서, 5의 2진 표현은
0000 0101이다.

 따라서 이에 대한 2의 보수는
1111 1011이며,

 이것이 정수 -5의 이진수 표현이
되는 것이다.

 근데 2의 보수는 또 어디서
튀어나온 것인가.

 

2의 보수를 구하는 방법

 본서는 프로그래밍 책인 만큼,
2의 보수에 대한

 수학적 개념은 뒤로하고, 계산법만
간단히 정리하겠다.

 다음 그림은 1바이트로 표현된

 양의 정수 '+5'에 대한 2의 보수를
구하는 과정이다.

그림 12 - 2의 보수를 구하는 과정

 위 그림이 보여주듯이,

 2의 보수를 계산하는 과정은
1의 보수를 구하는데서 시작한다.

 물론 1의 보수는 각 비트 별로
1은 0으로, 0은 1로 변환하여
얻을 수 있다.

 이렇게 1의 보수를 구한 후,
1을 더한 값,

 그것이 바로 2의 보수다.

 그렇다면, 실제 2의 보수 연산
결과가 0이 되는지 확인하자.

0000 0101 + 1111 1011 = ?

 위의 이진수 덧셈의 결과가
0이라면,

 분명 '2의 보수'는 양의 정수에
대한

 '음의 정수 표현 방법'으로 적절하다
결론내릴 수 있다.

   0000 0101
+ 1111 1011
----------------

1 0000 0000
// 올림 수 버림

 컴퓨터는 n바이트 덧셈 연산을
할 경우,

 그 결과도 n바이트로 만들어
낸다.

 따라서 올림 수(Carry) 보정을
하지 않으면,

 덧셈 과정에서 발생하는 올림 수는
그냥 버려진다.

 그렇기 때문에 위의 덧셈 결과는
0이 된다.

 결국 2의 보수는,

 양의 정수에 대한 음수 표현 방법으로
적합함을 알 수 있다.

 그리고 실제로 컴퓨터는 이러한
방식으로 음의 정수를 표현한다.


참고 및 출처

윤성우의 열혈 Java 프로그래밍
국내도서
저자 : 윤성우
출판 : 오렌지미디어 2017.07.05
상세보기