※ 질문/내용오류/공유할 내용이 있다면 jinkilee73@gmail.com으로 메일 주세요 :-)


보통 2진수를 표현하는 방법으로 컴퓨터는 2의 보수(2's Complement) 방법을 사용한다.

 

우선, 0 1 2 3 4 5 6 ... 15 를 각각 2진수로 나타내보자.(4비트로 표현하는 unsigned integer)

 

0        0000

1        0001

2        0010

3        0011

4        0100

5        0101

6        0110

7        0111

...       ...

13       1101

14       1110

15       1111

 

이와 같이 표현할 수 있다. 그런데 문제는 음수를 표현하고 싶을 때는 어떻게 하느냐가 관건이다. Sign bit을 이용하는 방법, 1의 보수를 이용하는 방법 등이 제안되었으나 결국 현재 사용하고 있는 것은 2의 보수 방법이다.

 

2의 보수를 만드는 법은 간단하다. 그저 1은 0으로 바꾸고 0은 1로 바꾼 후 마지막에 1만 더해주면 된다. 식으로는 다음과 같이 표현 가능하다. -x = ~x + 1. 4비트로 표현 가능한 2진수를 모두 나열해보자.(4비트로 표현하는 signed integer)


-8       1000

-7       1001

-6       1010

-5       1011

-4       1100

-3       1101

-2       1110

-1       1111

0         0000

1         0001

2         0010

3         0011

4         0100

5         0101

6         0110

7         0111


2의 보수의 특징을 한번 살펴보자. 32비트의 환경에서 2의 보수 범위는 아래와 같다.

Unsigned : 0 ~ 4,294,967,295(2의 32승 - 1)

Signed : -2147483648(2의 32승) ~ 2147483647(2의 32승 -1)

 

보면은 굉장히 개념이 쉽다. 바꾸는 방법도 매우 간단하고... 우리가 겨우 이거 배우려고 Chapter 2의 그 많은 내용들을 공부했을까? 아니다. 중요한 것은 2의 보수 환경에서 프로그래밍했을 때 생기는 문제점들을 집어보는 것이라고 생각한다.

 

다음 프로그램의 문제점이 무엇일까?


#include <stdio.h>


int main()

{

char i;


for(i = 0; i < 128; i++){

printf("%d ", i);

}

return 0;

}


char 형으로 i를 선언했다. 그리고 0 1 2 .... 127를 출력하려고 한다.
실제 실행 결과는 아래와 같다.

0 1 2 3 .. 127 -128 -127 ... 0 1 2 3 ... 127 -128 -127 ...

끝나지 않는다. char 형은 1바이트이다. 8비트로 표현이 되는데 127은 2진수 01111111로 표현가능하다. i가 2진수 01111111일 때 10진수127이 출력되고 그 다음은 어떻게 될까? i++을 하기 때문에 2진수 01111111 + 1 = 10000000가 된다. 그런데 signed char 형 10000000은 -128이다. 그렇다면 128이랑 비교를 하겠지? -128 < 128이다. 참이다. 그래서 -128을 출력한다. 그 이후도 계산을 해보면 -127 -126 이렇게 가게 된다. 

문제는 이러한 문제점을 컴파일러가 절대 notice해주지 않는다는 것이다. 2진수 표현 체계를 이해하지 못한 프로그래머 입장에서는 '내 컴퓨터가 고장났구나'하고 끝낼 문제인 샘이다.

이러한 문제점을 잘 이해하고 대처하기 위해서는 컴퓨터의 데이터 표현 방법을 잘 이해하고 있어야 한다. 실제로 예전에 로켓에 장착되어있는 프로그램에서 이와 같은 문제 때문에 시스템 에러가 발생하여 로켓이 추락하는 대형 참사가 일어났다고도 한다.

'System Programming' 카테고리의 다른 글

[SP] Virtual Memory (Basic Knowledge)  (1) 2013.04.23
[SP] Virtual Memory (Basic Knowledge)  (6) 2013.04.23
[SP] Floating Point Number  (0) 2013.04.15
[SP] Data Representation  (0) 2013.04.09
[SP] 시작해보며...  (0) 2013.04.06
Posted by 빛나유
,