보수(complement)
컴퓨터에서 음수를 직접적으로 표현할 수 없기 때문에 부호 비트를 지정하여 양수에 대한 음수는 2의 보수(tow's complement)를 사용하여 나타낼 수 있습니다.
보수는 어떤수를 보충하여 완전수를 만들게 하는 수로 1의 보수와 2의 보수 방법이 있으며 어떤수에 대응하는 음수의 이진수 표현은 2의 보수 방법을 적용합니다.
- 1의 보수 ⇒ 값의 반전, 즉 0 → 1, 1 → 0
- 예를 들어 4비트에서 완전수는 1111(2)이 됩니다. 그러므로 0010(2)에 1의 보수를 더하면 다음과 같이 완전수가 됩니다.
0 | 0 | 1 | 0 | ||
+ | 1 | 1 | 0 | 1 | (1의 보수) |
1 | 1 | 1 | 1 | (완전수) |
- 2의 보수⇒ 1의 보수 결과 + 1(2)
- 예를 들어 위의 1의 보수법에 의한 결과인 1101(2)에 1(2)를 더하면 1110(2)이 됩니다. 기준이 되는 최왼쪽에 있는 비트는 부호를 나타내는 것으로 1이므로 음수임을 나타냅니다.
- 이 음수값을 직접적으로 십진수로 전환할 수 없습니다. 그러므로 이 값을 알기 위해서는 다시 2의 보수를 결정합니다.
1 | 1 | 1 | 0 | |
1의 보수 → | 0 | 0 | 0 | 1 |
2의 보수 + | 0 | 0 | 0 | 1 |
2 ⇐ | 0 | 0 | 1 | 0 |
위 결과 1110(2)의 부호변환 결과는 2이므로 -2가 됩니다.
예)
16비트를 기준으로 2의 보수를 사용하여 십진수 7의 음수인 이진수를 결정해봅니다.
0 | 0 | 0 | 0 | … | 0 | 1 | 1 | 1 | ||
7에 대한 2의 보수: | 1 | 1 | 1 | 1 | … | 1 | 0 | 0 | 1 | ⇒ -7 |
-7의 2진수를 십진수로 확인하기 위해서는 다시 2의 보수를 적용합니다. | ||||||||||
-7에 대한 2의 보수: | 0 | 0 | 0 | 0 | … | 0 | 1 | 1 | 1 | ⇒ 7 |
numpy 패키지의 binary_repr()함수를 적용하여 확인할 수 있습니다.
from numpy import binary_repr binary_repr(-7, width=16)
'1111111111111001'
예)
8비트를 기준으로 2의 보수를 사용하여 127(10)의 음수인 이진수를 결정해봅니다.
127: | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |
2의 보수: | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | ⇒ -127 |
binary_repr(-127, width=8)
'10000001'
댓글
댓글 쓰기