정수의 음수 표현
부호 절대값 표기법
부호 절대값 표기법은 맨 앞의 최상위 비트(Most Significant Bit, MSB)에 부호를 저장하고, 나머지 비트에 수의 절대값을 저장하는 표기법이다.
최상위 비트가 0이면 양수를, 1이면 음수를 뜻한다.
| 양수 2진수 | 양수 10진수 | 음수 2진수 | 음수 10진수 |
|---|---|---|---|
| 0000 0000 | 0 | 1000 0000 | 0 |
| 0000 0001 | 1 | 1000 0001 | -1 |
| 0000 0010 | 2 | 1000 0010 | -2 |
| … | … | … | … |
| 0111 1101 | 125 | 1111 1101 | -125 |
| 0111 1110 | 126 | 1111 1110 | -126 |
| 0111 1111 | 127 | 1111 1111 | -127 |
표에서 보듯 0은 0000 0000과 1000 0000이라는 두 비트 패턴으로 표현된다.
같은 값을 표현하는 데 비트 패턴 두 개가 사용되므로, 표현 가능한 서로 다른 정수의 개수는 하나 줄어든다.
따라서 8비트 부호 절대값 표기법으로는 -127부터 127까지 총 255개의 서로 다른 정수를 표현할 수 있다.
또한 부호 절대값 표기법에서는 덧셈과 뺄셈을 단순한 이진수 덧셈만으로 처리할 수 없다.
예를 들어 1 - 1 = 1 + (-1) = 0이지만, 두 비트 패턴을 그대로 더하면 -2가 된다.
0000 0001 1
+ 1000 0001 -1
-----------
1000 0010 -2
1의 보수
1의 보수는 양수의 모든 비트를 반전하여 음수를 표현하는 방식이다.
최상위 비트가 0이면 양수를, 1이면 음수를 뜻한다.
| 양수 2진수 | 양수 10진수 | 음수 2진수 | 음수 10진수 |
|---|---|---|---|
| 0000 0000 | 0 | 1111 1111 | 0 |
| 0000 0001 | 1 | 1111 1110 | -1 |
| 0000 0010 | 2 | 1111 1101 | -2 |
| … | … | … | … |
| 0111 1101 | 125 | 1000 0010 | -125 |
| 0111 1110 | 126 | 1000 0001 | -126 |
| 0111 1111 | 127 | 1000 0000 | -127 |
0000 0000과 1111 1111이 모두 0을 나타내므로, 부호 절대값 표기법처럼 0이 중복 표현된다.
따라서 표현 가능한 정수의 범위는 -127부터 127까지이며, 서로 다른 정수는 총 255개다.
어떤 수를 빼려면 뺄 수의 1의 보수를 더하면 된다.
이때 최상위 비트 밖으로 넘친 자리올림은 버리지 않고 최하위 비트에 다시 더하는 순환 올림(end-around carry) 처리가 필요하다.
0000 0101 5
+ 1111 1101 -2
-----------
1 0000 0010
+1 순환 올림
-----------
0000 0011 3
2의 보수
2의 보수는 양수의 모든 비트를 반전한 뒤 1을 더하여 음수를 표현하는 방식이다.
계산 결과가 표현 가능한 비트 수를 넘으면, 최상위 비트 밖으로 넘친 자리올림은 버린다.
최상위 비트가 0이면 양수를, 1이면 음수를 뜻한다.
| 양수 2진수 | 양수 10진수 | 음수 2진수 | 음수 10진수 |
|---|---|---|---|
| 0000 0000 | 0 | 1111 1111 | -1 |
| 0000 0001 | 1 | 1111 1110 | -2 |
| 0000 0010 | 2 | 1111 1101 | -3 |
| … | … | … | … |
| 0111 1101 | 125 | 1000 0011 | -125 |
| 0111 1110 | 126 | 1000 0010 | -126 |
| 0111 1111 | 127 | 1000 0001 | -127 |
| 1000 0000 | -128 |
0000 0000의 비트를 반전하고 1을 더하면 다시 같은 비트 패턴이 되므로 0이 중복 표현되지 않는다.
따라서 8비트 2의 보수로는 -128부터 127까지 총 256개의 서로 다른 정수를 표현할 수 있다.
앞의 두 방법과 달리, 어떤 수를 빼려면 그 수의 2의 보수를 더한 뒤 최상위 비트 밖으로 넘친 자리올림을 버리면 된다.
즉, 덧셈만으로 뺄셈을 수행할 수 있다.
0000 0101 5
+ 1111 1110 -2
-----------
1 0000 0011
-----------
0000 0011 3