Superkkt Blog

C 표준에서 음수를 표현하는 방법은 아래와 같이 3개의 방법이 존재한다. 하지만 모든 방법에서 공통적으로 최상위 비트(MSB)는 부호 비트로 사용해서 이 값이 0이면 양수, 1이면 음수를 나타낸다. 그리고 최상위 비트를 제외한 나머지 비트들은 값 비트라고 해서 실제 값을 표현하는데 사용된다.

1. 부호 크기 표현 (Sign and Magnitude Representation)

음수를 표현하는 가장 직관적이고 단순한 방법이다. 부호 비트가 1이면, 나머지 값 비트들이 표현하는 양수값에 -를 붙이면 된다. 따라서 가장 큰 양수와 가장 작은 음수의 절대값이 같다.

예) 1010

최상위 비트 1은 부호 비트로 음수를 나타내고 나머지 값 비트 010은 양수 2이기 때문에 -를 붙여서 -2가 된다.

하지만 이 방법에서는 아래와 같이 0이 +0, -0으로 두개가 나오게 단점이 있다.

0000 = 0
1000 = 0


2. 1의 보수 표현 (1s' Complement Representation)

부호 비트가 1이고 값 비트의 개수가 n이라면, 해당 비트열은 다음과 같이 표현된다.

(값 비트에 의한 양수값) - (2^n -1)

위의 수식보다 더 간단하게 해석하는 방법은 부호 비트가 1일 경우 모든 비트를 반전시켜서 나오는 양수값에 -를 붙여서 표현하는 것이다.

예) 1001 = -6

부호 비트가 1이기 때문에 모두 반전 시켜서 0110을 만든다. 그리고 이 값에 -를 붙여서 표현하면 -6이 된다.

1의 보수 표현에서도 0이 +0과 -0으 두 가지로 표현되는 문제가 있다.

0000 = 0
1111 = 0


3. 2의 보수 표현 (2' s Complement Representation)

부호 비트가 1이고 값 비트의 개수가 n이라면, 해당 비트열은 다음과 같이 표현된다.

(값 비트에 의한 양수값) - 2^n

더 간단한 해석 방법은 앞에서 설명한 1의 보수 표현을 구한 후, 그 결과에 1을 더하는 것이다.

예) 1001 = -7

부호 비트가 1이기 때문에 모두 반전 시켜서 0110을 만든다. 그리고 이 값에 1을 더해서 0111을 만들고 -를 붙여서 표현하면 -7이 된다.

2의 보수 표현에서는 0을 표현하는 방법이 하나이다. 그래서 부호 크기 표현과 1의 보수 표현 방법보다 음수를 하나 더 표현 할 수 있다.

0000 = 0
1111 = -1


4. 정리

현재 대부분의 구현에서 여러 이점 때문에 2의 보수 표현을 사용하고 있다. 그러나 아직 부호 크기 표현이나 1의 보수 표현을 사용하는 시스템도 남아 있고, 또 이들 역시 장점이 있기 때문에 C 표준에서는 3가지 방법을 모두 사용할 수 있도록 해주고 있다. 예를 들어 16비트 short int의 최소값은 2의 보수 표현에서는 -32768이지만, 1의 보수 표현에서는 -32767이므로 표준은 -32767을 최소값으로 채택했다.


<관련글>

보수 표현: http://superkkt.com/287
무부호 정수형의 모듈로 연산: http://superkkt.com/285
2008/01/20 13:30 2008/01/20 13:30

trackbacks

trackbacks rss

이 글에는 트랙백을 보낼 수 없습니다

Leave a Comment