N Log

정수의 음수 표현

부호 절대값 표기법

부호 절대값 표기법은 맨 앞의 최상위 비트(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

표에서 보듯 00000 00001000 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 00001111 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