2의 보수
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
2의 보수는 이진법으로 음수를 표현하는 방법으로, 주어진 이진수의 모든 비트를 반전시킨 후 1을 더하여 얻는다. 뺄셈을 덧셈으로 변환하여 계산할 수 있게 하며, 컴퓨터에서 널리 사용된다. 2의 보수는 1의 보수를 이용하여 계산할 수 있으며, 덧셈, 뺄셈, 곱셈 등의 산술 연산에 사용된다.
더 읽어볼만한 페이지
2의 보수 | |
---|---|
개요 | |
종류 | 수학, 컴퓨터 과학에서의 이진법 연산 및 수 표현 방식 |
관련 개념 | 보수, 음수, 정수, 이진수, 부호 있는 숫자 표현 |
정의 | |
2의 보수 | 어떤 수 x에 대해, 2ⁿ - x (여기서 n은 비트 수) |
2의 보수 표현 | 음수를 표현하는 방법 중 하나로, 최상위 비트를 부호 비트로 사용 |
특징 | |
장점 | 덧셈 연산으로 뺄셈을 구현 가능 0의 표현이 유일함 |
단점 | 표현 가능한 수의 범위가 비대칭적임 (음수 범위가 1 더 넓음) |
계산 방법 | |
비트 반전 | 모든 비트를 0은 1로, 1은 0으로 바꿈 |
1 더하기 | 비트 반전 결과에 1을 더함 |
활용 | |
음수 표현 | 컴퓨터에서 정수를 표현하는 데 널리 사용됨 |
뺄셈 연산 | 덧셈 회로를 사용하여 뺄셈 연산을 효율적으로 수행 |
예시 | |
5의 2의 보수 (4비트) | 1011 (이진수) |
-5의 2의 보수 (4비트) | 0101 (이진수) |
관련 표준 | |
JIS X 0005:2002 | 정보 처리 용어 |
ISO/IEC 2382:2015 | 정보 기술 어휘 |
2. 2의 보수 표현
2의 보수는 주어진 이진수의 각 비트를 반전(0을 1로, 1을 0으로)시킨 후 1을 더하여 얻는다.[3] 이 방식은 뺄셈을 덧셈으로 변환하여 계산할 수 있게 한다.
2의 보수는 기수 보수의 한 예이다. N-비트 시스템에서 "2의 보수"는 2N에 대한 해당 숫자의 보수를 의미한다. 예를 들어, 3비트 이진수(N=3)에서 숫자 3 (0112)의 2의 보수는 5 (1012)이다. 이는 원래 숫자와 2의 보수를 더하면 23 = 8 (10002)가 되기 때문이다.
2의 보수 표현에서 음수는 최상위 비트(MSB)가 1로 표현된다. 예를 들어, 3비트 시스템에서 4는 -4, 5는 -3, 6은 -2, 7은 -1을 나타낸다.
비트 | 부호 없는 값 | 부호 있는 값 (2의 보수) |
---|---|---|
000 | 0 | 0 |
001 | 1 | 1 |
010 | 2 | 2 |
011 | 3 | 3 |
100 | 4 | −4 |
101 | 5 | −3 |
110 | 6 | −2 |
111 | 7 | −1 |
8비트 시스템에서도 동일한 원리가 적용된다.
비트 | 부호 없는 값 | 부호 있는 값 (2의 보수) |
---|---|---|
0000 0000 | 0 | 0 |
0000 0001 | 1 | 1 |
0000 0010 | 2 | 2 |
0111 1110 | 126 | 126 |
0111 1111 | 127 | 127 |
1000 0000 | 128 | −128 |
1000 0001 | 129 | −127 |
1000 0010 | 130 | −126 |
1111 1110 | 254 | −2 |
1111 1111 | 255 | −1 |
2의 보수는 1의 보수와 달리 음의 영을 나타내는 방법이 없어 관련된 어려움을 겪지 않는다. 또한, 덧셈, 뺄셈, 곱셈의 기본적인 산술 연산이 부호 없는 이진수와 동일하다는 장점을 가진다. (입력이 출력과 같은 비트 수로 표현되고 해당 비트를 넘어서는 모든 오버플로우가 결과에서 버려지는 한).
n 자릿수의 이진수 bn-1bn-2...b1b0에서, k+1 자릿수 값을 bk ∈ {0, 1}이라고 하면, 2의 보수 표현은 다음과 같이 나타낼 수 있다:
:
최상위 비트 bn-1는 부호 비트라고 불리며, 수치의 양음을 결정한다.
2. 1. 2의 보수 계산 방법
주어진 이진수의 모든 비트를 반전시킨다(1의 보수).[3] 반전된 결과에 1을 더한다.[3] 이때, 오버플로우는 무시한다.[3]8자리의 이진수 01001011(십진수로 75)의 2의 보수를 구하는 과정은 다음과 같다.
- 01001011의 모든 자릿수를 반전시킨다. (1의 보수)
- : 10110100
- 반전된 수에 1을 더한다.
- : 10110100 + 00000001 = 10110101
십진수 '''−6'''을 이진수로 계산하는 방법은 다음과 같다.[3]
- 1단계: 십진수 ''+6''은 이진수로 ''0110''이다. 왼쪽에서 첫 번째 비트(첫 번째 0)는 부호 비트이다.
- 2단계: ''0110''의 모든 비트를 반전하면 ''1001''이 된다.
- 3단계: 반전된 숫자 ''1001''에 1을 더하면 ''1010''이 된다.
''1010''의 값이 ''−6''임을 확인하는 과정은 다음과 같다.
비트: | 1 | 0 | 1 | 0 |
---|---|---|---|---|
십진수 자릿값: | −8 | 4 | 2 | 1 |
이진수 계산: | −(1×23) | (0×22) | (1×21) | (0×20) |
십진수 계산: | −(1×8) | 0 | 1×2 | 0 |
'''1010''' = '''−'''('''1'''×23) + ('''0'''×22) + ('''1'''×21) + ('''0'''×20) = '''1'''×−8 + '''0''' + '''1'''×2 + '''0''' = −6.
음수 2의 보수를 구하려면, 비트를 모두 반전(``비트별 NOT`` 연산 사용)시키고, 결과값에 1을 더한다. 0의 2의 보수를 취할 때 발생하는 오버플로는 무시한다.
예를 들어, 1바이트(=8비트)를 사용하면 10진수 5는 다음과 같이 나타낼 수 있다.
:0000 0101₂
2의 보수 표기법으로 -5로 변환하려면, 먼저 모든 비트를 반전한다.
:1111 1010₂
여기에 1을 더하여 2의 보수를 얻는다.
:1111 1011₂
어떤 수 x의 2의 보수 음수 x*는 다음과 같은 등식을 만족한다. x* = 2N − x.
예를 들어, -5의 4비트 표현을 구하면 다음과 같다.
x = 510 이므로 x = 01012
따라서 N = 4일 때:
x* = 2N − x = 24 − 510 = 1610 - 510 = 100002 − 01012 = 10112
2의 보수를 구하는 다른 방법은 최하위 비트(LSB)에서 시작하여 최상위 비트(MSB) 방향으로 모든 0을 복사하다가 첫 번째 1을 만날 때까지 계속하고, 그 1을 복사한 후 나머지 비트를 모두 반전시키는 것이다. 예를 들어, "0011 1100"의 2의 보수는 "1100 0100"이다.
4비트 이진수 00102 (2)의 2의 보수는 11102이다. 이 둘을 덧셈하면 다음과 같다.
:
2. 2. 2의 보수를 이용한 뺄셈
뺄셈은 2의 보수를 더하는 방식으로 수행된다.[3] 예를 들어, 100 - 75는 100 + (-75)와 같다. 2의 보수에서는 가장 높은 자리에서 자리 올림이 발생하면 무시하므로 1의 보수보다 계산이 간단하다.8자리의 이진수 01001011(십진수로 75)의 2의 보수를 구하는 과정은 다음과 같다.
- 먼저, 01001011의 모든 자리의 수를 반전시켜 1의 보수 10110100(십진수 180)을 얻는다.
- 여기에 1을 더하면 10110101(십진수 181)이 된다.
- 100 - 75 = 100 + (-75) 이므로, 01100100 + 10110101 = 100011001 이 된다.
- 새로 생긴 가장 높은 자리의 숫자를 빼고 남은 00011001은 십진수로 25와 같으며, 이는 계산하려던 식의 결과이다.
4비트 이진수 00102 (십진수 2)의 2의 보수는 11102이다. 이 둘을 덧셈하면 다음과 같다.
:
결과는 100002 = 24 = 16이 되며, 11102이 00102의 100002에 대한 보수임을 확인할 수 있다. 또한 5비트째 이후를 무시하고 아래 4비트만 취하면 결과는 00002이 된다. 즉, 00102에 그 2의 보수 11102를 더하는 것은 0010에서 0010 자신을 빼는 것과 같은 의미를 가진다. 다시 말해, 11102는 음수 −2를 나타낸다.
이진수 01012 (십진수 5)에서 이진수 00112 (십진수 3)를 빼는 경우와 이진수 00112의 2의 보수 11012를 더하는 계산은 다음과 같다.
:
:
5번째 자릿수 이후를 무시하고 아래 4자릿수만 취하면, 결과는 00102 (십진수 2)가 되어 뺄셈의 경우와 일치한다. 또한, 11012는 음수 −3를 나타내는 것을 알 수 있다.
컴퓨터는 보통 보수법을 사용하여 뺄셈을 구현한다. 뺄셈에 보수를 사용하는 것은 음수를 나타내는 데 보수를 사용하는 것과 밀접하게 관련되어 있는데, 이는 이 조합을 통해 피연산자와 결과의 모든 부호를 허용하기 때문이다. 직접 뺄셈은 2의 보수 수에도 적용된다. 덧셈과 마찬가지로 2의 보수를 사용하는 장점은 피연산자의 부호를 검사하여 덧셈인지 뺄셈인지 결정할 필요가 없다는 것이다. 예를 들어, 15에서 −5를 빼는 것은 실제로 15에 5를 더하는 것과 같지만, 2의 보수 표현으로 이것이 숨겨져 있다.
3. 컴퓨터에서의 2의 보수
컴퓨터의 CPU를 구성하는 가장 중요한 요소는 ALU인데, 정수형 처리는 ALU에서 이루어진다. CPU의 비트 수 제한으로 인해 이진법 계산에서 비트를 벗어나면 버리게 된다.
CPU는 4비트부터 시작했지만, 주로 8비트와 32비트 이상을 많이 사용한다. 2의 보수를 적용할 때, 프로그램에서 부호를 지정하는 변수를 사용함으로써 구현할 수 있다. 예를 들어, 4비트 이진수 00102 (= 2)의 2의 보수는 11102이다. 실제로, 이 둘을 덧셈하면 다음과 같다.
:
결과는 100002 = 24 = 16이 되며, 11102이 00102의 100002에 대한 보수임을 확인할 수 있다. 또한 5비트째 이후를 무시하고 아래 4비트만 취하면 결과는 00002이 된다. 즉, 00102에 그 2의 보수 11102를 더하는 것은 0010에서 0010 자신을 빼는 것과 같은 의미를 가진다. 다시 말해, 11102는 음수 -2를 나타낸다.
3. 1. C 프로그래밍 언어에서의 2의 보수
C 언어에서 `char`, `int`와 같은 정수형 변수는 2의 보수 표현을 사용한다. 컴파일러는 음수 값을 2의 보수로 변환하여 기계어 코드를 생성한다.```c
char chr;
chr = -3;
chr += 4;
int inum = -7;
```
위 코드에서 `char`는 8비트 정수형 변수이며, `unsigned` 키워드가 없으므로 부호를 갖는 정수형 변수이다.
- 00000011 (+3 - 8자리)
- 11111100 (3의 1의 보수)
- \+) 00000001 (1 더하기)
- -----------
- 11111101 (-3)
`chr += 4;` 연산은 ALU에서 이루어지며, 다음과 같이 이진수로 나타낼 수 있다.
- 11111101 (-3)
- \+) 00000100 (4 더하기)
- -----------
- 1 00000001 (1)
여기서 MSB의 1은 버려지고 8비트만 레지스터에 저장된다. ALU 계산 시 8자리에서 9자리로 넘어가는 이진수는 Carry라고 하며, CPU 레지스터 중 Flag 레지스터에 저장되어 올림 여부를 저장한다. 최종 계산 값은 00000001이 된다.
int 변수는 16/32비트를 사용하는데, 32비트의 경우 -7은 다음과 같이 표현된다.
- 00000000000000000000000000000111 (+7 : 32자리)
- 11111111111111111111111111111000 (7의 1의 보수)
- \+) 00000000000000000000000000000001 (7의 '1의 보수' + 1 : 더하기)
- ----------------------------------
- 11111111111111111111111111111001 (-7)
3. 2. 자바 프로그래밍 언어에서의 2의 보수
자바는 플랫폼 독립적인 언어이므로, 변수의 비트 수가 명확하게 정의되어 있다. `byte`, `short`, `int`, `long` 등의 정수형 변수는 2의 보수 표현을 사용한다.자료형 | 비트 수 |
---|---|
`byte` | 8비트 |
`short` | 16비트 |
`int` | 32비트 |
`long` | 64비트 |
자바에서의 `byte`는 C언어의 `char`와 같다. 이 비트 한계에서 이진수가 취급되고 만약 숫자 연산에서 자릿수가 벗어나면 C언어처럼 버린다.
4. 2의 보수 이론
2의 보수는 기수 보수의 한 예이다. N-비트 시스템에서 "2의 N승" ()을 나타내며, N-비트 숫자의 ''2의 보수''는 에 대한 해당 숫자의 보수이다.[4] 예를 들어, 3비트 이진수(이고 )에서 숫자 3 ()의 2의 보수는 5 ()이다. 원래 숫자와 더하면 가 되기 때문이다.
이진 표현에서 최상위 비트는 부호를 나타낸다. 음이 아닌 첫 번째 그룹은 0이고, 음수의 두 번째 그룹은 1이다.
비트 | 부호 없는 값 | 부호 있는 값 (2의 보수) |
---|---|---|
000 | 0 | 0 |
001 | 1 | 1 |
010 | 2 | 2 |
011 | 3 | 3 |
100 | 4 | −4 |
101 | 5 | −3 |
110 | 6 | −2 |
111 | 7 | −1 |
비트 | 부호 없는 값 | 부호 있는 값 (2의 보수) |
---|---|---|
0000 0000 | 0 | 0 |
0000 0001 | 1 | 1 |
0000 0010 | 2 | 2 |
0111 1110 | 126 | 126 |
0111 1111 | 127 | 127 |
1000 0000 | 128 | −128 |
1000 0001 | 129 | −127 |
1000 0010 | 130 | −126 |
1111 1110 | 254 | −2 |
1111 1111 | 255 | −1 |
2의 보수는 덧셈, 뺄셈, 곱셈의 기본적인 산술 연산이 부호 없는 이진수와 동일하게 동작한다는 장점이 있다. 또한, 1의 보수와 달리 음의 영을 나타내는 방법이 없어 관련된 어려움을 겪지 않는다.[4]
N비트 값에서 하위 절반은 0부터 까지, 상위 절반은 부터 −1까지의 정수를 나타낸다. 상위 절반은 을 법으로 하는 덧셈에서 음수와 동일하게 동작한다.[11]
n자리 이진수 x와 그 보수 xc는 다음 관계를 만족한다.
:
의 배수를 0과 동일시하면, 위의 보수 관계는 을 법으로 하는 합동식으로 바꿀 수 있다.
:
이는 x의 보수 xc를 x의 역수 -x로 볼 수 있다는 것을 의미한다. 즉, 수 y에서 x를 빼는 연산은 수 y와 보수 xc의 덧셈으로 바꿀 수 있다.
:
마찬가지로 역수 -x의 곱셈은 보수의 곱으로 바꿀 수 있다.
:
5. 2의 보수 변환
2의 보수 표현은 양수와 음수를 모두 나타낼 수 있으며, 최상위 비트는 부호를 나타낸다. (0: 양수, 1: 음수)[4]
N-비트 숫자 ''2의 보수''의 정확한 정의는 2N에 대한 해당 숫자의 보수이다. 2의 보수를 구하는 방법은 다음과 같다:[4]
- 1의 보수를 이용하는 방법:
1. 주어진 이진수의 모든 자리의 수를 반전시켜 1의 보수를 구한다.
2. 1의 보수에 1을 더한다.
3. 이 과정에서 발생하는 오버플로우는 무시한다.
- 2N으로부터의 뺄셈:
1. 2N에서 주어진 수를 뺀다. (N은 비트 수)
- 최하위 비트(LSB)에서 최상위 비트(MSB) 방향으로 변환:
1. LSB에서 시작하여 MSB 방향으로 이동하면서 첫 번째 1을 만날 때까지 모든 0을 그대로 둔다.
2. 첫 번째 1을 만난 후, 나머지 비트들을 모두 반전시킨다.
8자리의 이진수 01001011(십진수로 75)의 2의 보수를 구하는 예시는 다음과 같다.
- 1의 보수를 이용하는 방법:
1. 01001011의 모든 자리의 수를 반전시킨다: 10110100
2. 여기에 1을 더한다: 10110100 + 00000001 = 10110101
- 28으로부터의 뺄셈:
: 100000000 (256) - 01001011 (75) = 10110101 (181)
0부터 2n-1 - 1까지의 음이 아닌 정수를 일반적인 위치 기수법에서의 이진 표시에 대응시키면, 이러한 수의 보수로서 음의 정수에 대한 2의 보수 표현을 얻을 수 있다. 4비트(n=4)의 예를 들면 다음과 같다.
대응하는 수치 | 이진수 | 대응하는 수치 | 이진수 |
---|---|---|---|
0 | 00002 | ||
1 | 00012 | −1 | 11112 |
2 | 00102 | −2 | 11102 |
3 | 00112 | −3 | 11012 |
4 | 01002 | −4 | 11002 |
5 | 01012 | −5 | 10112 |
6 | 01102 | −6 | 10102 |
7 | 01112 | −7 | 10012 |
−8 | 10002 |
n 자릿수의 이진수의 k+1 자릿수 값을 bk ∈ {0, 1}이라고 하면, 2의 보수 표현은 다음과 같이 나타낼 수 있다.
:
5. 1. 1의 보수로부터 변환
음수의 2의 보수를 구하려면, 먼저 1의 보수를 구한 후 1을 더한다. 0의 2의 보수를 취할 때 발생하는 오버플로우는 무시한다.[3]8자리의 이진수 01001011(십진수로 75)의 2의 보수를 구하는 과정은 다음과 같다.
- 01001011의 모든 자리의 수를 반전시켜 1의 보수를 구한다: 10110100 (십진수 180)
- 1의 보수에 1을 더한다: 10110100 + 00000001 = 10110101 (십진수 181)
십진수 6에서 -6을 이진수로 계산하는 방법은 다음과 같다.
# 십진수 +6은 이진수로 0110이다.
# 0110의 모든 비트를 반전하면 1001이 된다.
# 반전된 숫자 1001에 1을 더하면 1010이 된다.
1010이 -6임을 확인하는 방법은 다음과 같다.
비트 | 1 | 0 | 1 | 0 |
---|---|---|---|---|
십진수 자릿값 | -8 | 4 | 2 | 1 |
이진수 계산 | -(1×23) | (0×22) | (1×21) | (0×20) |
십진수 계산 | -(1×8) | 0 | 1×2 | 0 |
- 계산 결과: -8 + 0 + 2 + 0 = -6
2의 보수 연산은 역원 연산이므로, 음수는 절댓값의 2의 보수로 나타낸다. 예를 들어 십진수 5는 8비트 이진수로 0000 0101₂로 표현된다.
- 5를 2의 보수로 표현하는 방법은 다음과 같다.
# 모든 비트를 반전한다 (1의 보수): 1111 1010₂
# 1을 더한다 (2의 보수): 1111 1011₂
0의 2의 보수는 0이다. 반전하면 모두 1이 되고, 1을 더하면 오버플로우가 발생하여 다시 0이 된다.
가장 작은 음수의 2의 보수는 자기 자신이다.
5. 2. 2N으로부터의 뺄셈
N영어-비트 숫자의 ''2의 보수''의 정확한 정의는 에 대한 해당 숫자의 보수이다.양수 x의 2의 보수 음수 x*의 값은 다음과 같이 계산할 수 있다.
: x* = 2N − x
예를 들어, -5의 4비트 표현을 구하는 방법은 다음과 같다. (첨자는 진수를 나타낸다.)
: x = 510 이므로 x = 01012
: 따라서 N = 4일 때:
: x* = 2N − x = 24 − 510 = 1610 - 510 = 100002 − 01012 = 10112
위 계산은 10진수로 완전히 수행하고 마지막에 2진수로 변환할 수도 있다.
: x* = 2N − x = 24 − 510 = 1110 = 10112
2의 보수를 이용하면, n자리 이진수 x와 그 보수 xc는 다음 관계를 만족한다.[3]
:
거듭제곱 2n의 배수를 0과 동일시하면, 위의 보수 관계는 2n을 법(法)으로 하는 합동식으로 바꿀 수 있다.
:
이는 x의 보수 xc를 x의 역수 -x로 볼 수 있다는 것을 의미한다. 즉, 수 y에서 x를 빼는 연산은 수 y와 보수 xc의 덧셈으로 바꿀 수 있다.
:
5. 3. 최하위 비트(LSB)에서 최상위 비트(MSB) 방향으로의 변환
2의 보수를 수동으로 변환하는 간단한 방법은 최하위 비트(LSB)에서 시작하여 최상위 비트(MSB) 방향으로 모든 0을 복사하다가 첫 번째 1을 만날 때까지 계속하고, 그 1을 복사한 후 나머지 비트를 모두 반전시키는 것이다(원래 숫자가 부호-크기 표현 방식이라면 MSB는 1로 남겨둡니다).[3] 이 방법을 사용하면 1의 보수를 먼저 구하지 않고도 2의 보수로 변환할 수 있다. 예를 들어, 2의 보수 표현에서 "0011 1100"의 반전은 "1100 0'''100'''"인데, 밑줄 친 자릿수는 복사 작업에서 변경되지 않았고 나머지 자릿수는 반전되었다.6. 부호 확장
2의 보수로 표현된 특정 비트 수의 정수를 더 많은 비트로 변환할 때(예: 1바이트 변수에서 2바이트 변수로 복사할 때), 최상위 비트는 추가된 모든 비트에 반복되어야 한다. 일부 프로세서는 이 작업을 단일 명령어로 수행하지만, 다른 프로세서에서는 조건문을 사용하여 관련 비트 또는 바이트를 설정하는 코드를 실행해야 한다.
숫자를 오른쪽으로 시프트할 때 부호 비트를 포함하는 최상위 비트는 유지되어야 한다. 그러나 왼쪽으로 시프트할 때는 비트가 밀려나간다. 이러한 규칙은 왼쪽 시프트가 숫자를 2배로 곱하고 오른쪽 시프트가 숫자를 2로 나누는 일반적인 의미를 유지한다. 그러나 최상위 비트가 0에서 1로(또는 그 반대로) 변경되면, 값이 부호 있는 정수를 나타내는 경우 오버플로가 발생한다.
십진수 | 7비트 표기 | 8비트 표기 |
---|---|---|
−42 | 1010110 | 1101 0110 |
42 | 0101010 | 0010 1010 |
7. 가장 작은 음수
2의 보수 표현에서 가장 작은 음수는 예외적인 경우이다. 이 수의 2의 보수는 자기 자신이다.[4] 예를 들어, 8비트 시스템에서 -128의 2의 보수는 -128이다. -128의 음수화에서 예상되는 결과는 +128이지만, 8비트 2의 보수 시스템으로는 +128을 표현할 수 없으므로 실제로는 음수화를 표현할 수 없다. 2의 보수가 같은 숫자라는 것은 최상위 비트로의 자리올림은 있었지만 최상위 비트에서의 자리올림이 없었으므로 오버플로우 조건으로 감지된다.[4]
−128 | 1000 0000 |
비트 반전 | 0111 1111 |
1 더하기 | 1000 0000 |
colspan="2;" | |
0이 자신의 음수와 같고 숫자의 총 개수가 짝수라는 사실 때문에 0이 아닌 숫자가 자신의 음수와 같게 되는 것은 불가피하다.
최소 음수의 존재는 예기치 않은 프로그래밍 버그로 이어질 수 있다. 예를 들어,
- 단항 음수 연산자는 0이 아닌 숫자의 부호를 변경하지 않을 수 있다. 예: −(−128) ↦ −128.
- 절댓값 구현은 음수를 반환할 수 있다.[6] 예: abs(−128) ↦ −128.
- 마찬가지로, −1을 곱하면 예상대로 작동하지 않을 수 있다. 예: (−128) × (−1) ↦ −128.
- −1로 나누면 (0으로 나누는 것과 같은) 예외가 발생할 수 있다.[7] −1로 나머지(또는 모듈로)를 계산하는 것조차 이 예외를 발생시킬 수 있다.[8] 예: (−128) ÷ (−1) ↦ , (−128) % (−1) ↦ .
C 및 C++ 프로그래밍 언어에서 위의 동작은 정의되지 않음이며 이상한 결과를 반환할 뿐만 아니라 컴파일러는 프로그래머가 정의되지 않은 숫자 연산이 절대 발생하지 않도록 보장했다고 가정하고 그 가정에서 추론을 내릴 수 있다.[8]
2의 보수에서 이 최소 음수는 유일한 예외이기 때문에 때때로 "이상한 숫자"라고 불린다.[9][10] 이 숫자는 예외이지만 일반적인 2의 보수 시스템에서 유효한 숫자이다. 모든 산술 연산은 피연산자와 (오버플로우가 없다면) 결과로서 이 숫자와 함께 작동한다.
8. 2의 보수와 2진수(2-adic Numbers)
빌 고스퍼는 1972년 MIT 인공지능 연구소(MIT AI Lab)에서 발표된 고전적인 ''HAKMEM''에서 2의 보수 표현이 2진수와 관련이 있음을 언급했다.[16] 2진수는 무한한 비트 문자열을 숫자로 간주하는 방법을 제공한다.
고스퍼는 2의 거듭제곱을 연속적으로 합산하여 기계의 내부 표현이 2의 보수인지 판별할 수 있다고 지적하며, 이를 대수적으로 계산한 결과가 "대수는 2의 보수를 사용하는 기계(우주)에서 실행된다"는 것을 시사한다고 언급했다.[16]
고스퍼의 결론은 수학적 유머에 가깝다. "...110 = ...111 − 1", 즉 "2''X'' = ''X'' − 1"이며, 따라서 ''X'' = ...111 = −1이다. 이는 무한한 1의 문자열을 숫자로 간주하는 것을 전제로 하며, 모든 정수에 대한 2의 보수 표기법의 일부로, 전형적인 2진수로, 또는 실수의 발산급수 1 + 2 + 4 + 8 + ···에 대해 정의된 일반화된 합 중 하나로 의미가 있다.[17] 무한한 비트 문자열로 동작하도록 이상화된 디지털 산술 회로는 2의 보수 표현과 호환되는 2진수 덧셈과 곱셈을 생성한다.[18] 2진수 메트릭에서 이진 산술 및 비트 연산의 연속성은 암호화에서도 어느 정도 사용된다.[19]
9. 산술 연산
2의 보수 표현을 사용하면 덧셈, 뺄셈, 곱셈 등의 산술 연산을 간단하게 처리할 수 있다.
- '''덧셈''': 2의 보수 덧셈은 피연산자의 부호에 관계없이 수행할 수 있으며, 결과의 부호는 자동으로 결정된다.[1]
- '''뺄셈''': 뺄셈은 빼는 수의 2의 보수를 더하는 방식으로 수행된다. 2의 보수에서는 가장 높은 자리에서 자리 올림이 발생할 때 이를 무시하므로 1의 보수보다 계산이 간단하다.
- '''곱셈''': 두 개의 N-비트 숫자의 곱은 모든 가능한 값을 포함하려면 2N 비트가 필요하다.[13] 2의 보수를 사용하는 두 피연산자의 정밀도가 곱셈 전에 두 배로 늘어난다면, 직접 곱셈(그 정밀도를 넘어서는 비트는 버림)은 올바른 결과를 제공한다.[14]
- '''비교''': 2의 보수 표현에서 두 수의 비교는 뺄셈을 통해 수행할 수 있다. 상태 레지스터의 제로 플래그는 두 값이 같은지 여부를 나타낸다. 부호와 오버플로 플래그의 배타적 논리합이 1이면 뺄셈 결과가 0보다 작고, 그렇지 않으면 0 이상이다.
하지만 덧셈 결과, 산술 오버플로가 발생하는 경우가 있다.[1] 예를 들어, 5(바이너리 0101)와 3(바이너리 0011)의 덧셈에서, 결과는 1000이 된다. 이는 2의 보수 표현에서 -8에 해당하며, 일반적인 덧셈 결과인 8과 다르다. 마찬가지로, -3(바이너리 1101)과 -6(바이너리 1010)의 덧셈에서도, 결과는 0111(7)이 되어, 예상되는 결과 -9와 일치하지 않는다.
2의 보수를 이용한 이진법으로 표현된 수(이진수)를 음수의 정수에 대응시킬 수 있다. 2의 보수의 정의에 따르면, n자리 이진수 x와 그 보수 xc는 다음 관계를 만족한다.
:
거듭 제곱 2n의 배수를 0과 동일시하면, 위의 보수 관계는 2n을 법으로 하는 합동식으로 바꿀 수 있다.
이는 x의 보수 xc를 x의 역수 -x로 볼 수 있다는 것을 의미한다. 즉, 수 y에서 x를 빼는 연산은 수 y와 보수 xc의 덧셈으로 바꿀 수 있다.
마찬가지로 역수 -x의 곱셈은 보수의 곱으로 바꿀 수 있다.
9. 1. 덧셈
2의 보수 표현을 사용하면, 피연산자의 부호에 관계없이 덧셈을 수행할 수 있다. 결과의 부호는 자동으로 결정된다.[1] 예를 들어, 15와 -5를 더하는 경우를 보면 다음과 같다.```
0000 1111 (15)
+ 1111 1011 (-5)
```
4비트 이진수 의 2의 보수는 이다. 실제로, 이 둘을 덧셈하면 다음과 같다.[1]
:
결과는 이 되며, 이 의 에 대한 보수임을 확인할 수 있다. 또한 5비트째 이후를 무시하고 아래 4비트만 취하면 결과는 이 된다. 즉, 에 그 2의 보수 를 더하는 것은 에서 자신을 빼는 것과 같은 의미를 가진다. 다시 말해, 는 음수 를 나타낸다.[1]
하지만 덧셈 결과, 산술 오버플로가 발생하는 경우가 있다.[1]
예를 들어, 이진수 와 이진수 의 덧셈은 다음과 같이 계산할 수 있다.[1]
:
결과는 이 되지만, 이것은 2의 보수 표현에서 음수 에 해당하며, 일반적인 덧셈에서 예상되는 결과 와 일치하지 않는다.[1]
마찬가지로, 이진수 와 이진수 의 덧셈은 예상되는 결과를 주지 않는다.[1]
:
결과는 이 되며, 일반적인 덧셈에서 예상되는 결과 와 일치하지 않는다.[1]
9. 2. 뺄셈
뺄셈은 빼는 수의 2의 보수를 더하는 방식으로 수행된다. 2의 보수에서는 가장 높은 자리에서 자리 올림이 발생할 때 이를 무시하므로 1의 보수보다 계산이 간단하다.예를 들어, 4비트 이진수 00102 (= 2)의 2의 보수는 11102이다. 이 둘을 덧셈하면 다음과 같다.
0 | 0 | 1 | 0 | ||
+ | 1 | 1 | 1 | 0 | |
0 | 0 | 0 | 0 |
결과는 100002 = 24 = 16이 되며, 11102이 00102의 100002에 대한 보수임을 확인할 수 있다. 5비트째 이후를 무시하고 아래 4비트만 취하면 결과는 00002이 된다. 즉, 00102에 그 2의 보수 11102를 더하는 것은 0010에서 0010 자신을 빼는 것과 같은 의미를 가지며, 11102는 음수 −2를 나타낸다.
이진수 01012 (= 5)에서 이진수 00112 (= 3)를 빼는 경우를 보자.
0 | 1 | 0 | 1 | ||
- | 0 | 0 | 1 | 1 | |
0 | 0 | 1 | 0 |
한편, 이진수 00112의 2의 보수 11012를 더하면 다음과 같다.
0 | 1 | 0 | 1 | ||
+ | 1 | 1 | 0 | 1 | |
0 | 0 | 1 | 0 |
5번째 자릿수 이후를 무시하고 아래 4자릿수만 취하면 결과는 00102 (= 2)가 되어 뺄셈의 경우와 일치한다. 또한, 11012는 음수 −3를 나타낸다.
컴퓨터는 보통 보수법을 사용하여 뺄셈을 구현한다. 뺄셈에 보수를 사용하는 것은 음수를 나타내는 데 보수를 사용하는 것과 밀접하게 관련되어 있다. 이 조합을 통해 피연산자와 결과의 모든 부호를 허용하기 때문이다. 직접 뺄셈은 2의 보수 수에도 적용된다. 덧셈과 마찬가지로 2의 보수를 사용하는 장점은 피연산자의 부호를 검사하여 덧셈인지 뺄셈인지 결정할 필요가 없다는 것이다. 예를 들어, 15에서 −5를 빼는 것은 실제로 15에 5를 더하는 것과 같지만, 2의 보수 표현으로 이것이 숨겨져 있다.
9. 3. 곱셈
두 개의 N-비트 숫자의 곱은 모든 가능한 값을 포함하려면 2N 비트가 필요하다.[13]만약 2의 보수를 사용하는 두 피연산자의 정밀도가 곱셈 전에 두 배로 늘어난다면, 직접 곱셈(그 정밀도를 넘어서는 비트는 버림)은 올바른 결과를 제공할 것이다.[14] 예를 들어, 6 × (−5) = −30을 생각해 보자. 먼저 정밀도가 4비트에서 8비트로 확장된다. 그런 다음 숫자들을 곱하고, 8번째 비트를 넘어서는 비트들은 버린다.
9. 4. 비교
2의 보수 표현에서 두 수의 비교는 뺄셈을 통해 수행할 수 있다. 상태 레지스터의 제로 플래그는 두 값이 같은지 여부를 나타낸다. 부호와 오버플로 플래그의 배타적 논리합이 1이면 뺄셈 결과가 0보다 작고, 그렇지 않으면 0 이상이다. 이러한 검사는 조건 분기 명령어에서 컴퓨터에 구현된다.부호 없는 이진수는 비트 값 0이 비트 값 1보다 작게 정의된 사전식 순서로 정렬할 수 있다. 보수 표현 값의 경우, 최상위 비트의 의미는 반전된다 (즉, 1이 0보다 작다).
덧셈 결과, 산술 오버플로가 발생하는 경우가 있다. 예를 들어, 5(이진수 binary|바이너리영어 0101)와 3(이진수 binary|바이너리영어 0011)의 덧셈에서, 결과는 1000이 된다. 이는 2의 보수 표현에서 -8에 해당하며, 일반적인 덧셈 결과인 8과 다르다. 마찬가지로, -3(이진수 binary|바이너리영어 1101)과 -6(이진수 binary|바이너리영어 1010)의 덧셈에서도, 결과는 0111(7)이 되어, 예상되는 결과 -9와 일치하지 않는다.
10. 2의 보수 표현의 성질 (일본어 문서 내용)
4비트 이진수 00102 (= 2)의 2의 보수는 11102이다. 이 둘을 덧셈하면 다음과 같다.
:
결과는 100002 = 24 = 16이 되며, 11102이 00102의 100002에 대한 보수임을 확인할 수 있다. 5비트째 이후를 무시하고 아래 4비트만 취하면 결과는 00002이 된다. 즉, 00102에 그 2의 보수 11102를 더하는 것은 0010에서 0010 자신을 빼는 것과 같은 의미를 가지며, 11102는 음수 -2를 나타낸다.
2의 보수를 이용하면 이진법으로 표현된 수(이진수)를 음의 정수에 대응시킬 수 있다. n자리 이진수 x와 그 보수 xc는 다음 관계를 만족한다.
:
거듭제곱 2n의 배수를 0과 동일시하면, 위의 보수 관계는 2n을 법으로 하는 합동식으로 바꿀 수 있다.
:
이는 x의 보수 xc를 x의 역수 -x로 볼 수 있다는 것을 의미한다. 즉, 수 y에서 x를 빼는 연산은 수 y와 보수 xc의 덧셈으로 바꿀 수 있다.
:
마찬가지로 역수 -x의 곱셈은 보수의 곱으로 바꿀 수 있다.
:
음수의 계산을 위해 0부터 2''n''-1 - 1까지의 음이 아닌 정수를 일반적인 위치 기수법에서의 이진 표시로 대응시킨다.
:
이러한 수의 보수로서 음의 정수에 대한 2의 보수 표현을 얻을 수 있다.
:
n 자릿수의 이진수에서 k+1 자릿수 값을 bk라고 하면, 2의 보수 표현은 다음과 같이 나타낼 수 있다.
:
최상위 비트 bn-1는 부호 비트라고 불리며, 수치의 양음을 결정한다. 부호 비트가 0이면 양수, 1이면 음수를 나타낸다.
4 자릿수의 이진수에서의 대응표는 다음과 같다.
대응하는 수치 | 이진수 | 대응하는 수치 | 이진수 |
---|---|---|---|
0 | 00002 | - | - |
1 | 00012 | -1 | 11112 |
2 | 00102 | -2 | 11102 |
3 | 00112 | -3 | 11012 |
4 | 01002 | -4 | 11002 |
5 | 01012 | -5 | 10112 |
6 | 01102 | -6 | 10102 |
7 | 01112 | -7 | 10012 |
- | - | -8 | 10002 |
2의 보수 표현은 부호 비트가 0이면 부호 없는 정수 표현(일반적인 이진법)과 일치하며, n비트로 표현 가능한 수의 범위는 −2n−1부터 2n−1 − 1까지로, 음수 범위가 양수 범위보다 1만큼 커 비대칭적이다. 짝수/홀수 여부는 최하위 비트(LSB)로 판별하며, 양수/음수 판정은 최상위 비트만으로 가능하다.
2의 보수 표현에서 -1은 항상 모든 자릿값이 1인 이진수 111...11₂에 대응된다. 비트열 x와 그 비트를 반전시킨 비트열 fx는 다음을 만족한다.
:
x의 2의 보수는 cx = fx + 1로 나타낼 수 있으며, 비트 반전은 1의 보수를 얻는 연산이다.
:
n비트 이진수 x의 하위 m-1 비트까지의 값이 0이었을 경우, 2의 보수를 구할 때 하위 M = min(m, n) 비트까지 원래 수와 2의 보수의 값이 일치하고, 나머지 상위 n-M 비트는 비트 반전의 상위 n-M 비트와 일치한다.
24에 대한 2의 보수 표현에서 보수와 원래 수의 하위 비트 일치 예시는 다음과 같다.
원래 수와 일치하는 하위 비트의 자릿수 (M) | 1 | 2 | 3 | 4 | 4 |
---|---|---|---|---|---|
원래 수 (x) | B3B2B1 | B3B2 | B3 | ||
비트 반전 (fx) | 321 | 32 | 3 | ||
2의 보수 (fx + 1) | 321 | 32 | 3 |
10. 1. 부호 없는 정수와의 일치
2의 보수 표현에서 부호 비트가 0이면, 일반적인 이진수 표현(부호 없는 정수 표현)과 같다.[4] 이러한 성질은 부호-절댓값 표현이나 1의 보수 표현에도 나타난다.10. 2. 최솟값과 최댓값의 비대칭성
n비트 2의 보수 표현에서 표현 가능한 수의 범위는 −2n−1부터 2n−1 − 1까지이다.[1] 예를 들어 n = 8인 경우, −128부터 +127까지 표현할 수 있다. 최솟값(-2n-1)의 절댓값은 최댓값(2n-1 - 1)보다 1만큼 크다. 즉, 음수의 범위가 양수의 범위보다 1만큼 더 크며, 이는 비대칭적인 구조를 가진다. 이러한 비대칭성 때문에 최솟값의 2의 보수를 구할 때 산술 오버플로우가 발생한다.이러한 특성은 부호-절댓값 표현이나 1의 보수 표현에서는 나타나지 않는다. 부호-절댓값 표현과 1의 보수 표현은 수의 범위가 −(2n−1 − 1)부터 +(2n−1 − 1)까지로 대칭적이다.
10. 3. 짝수/홀수 판정
2의 보수 표현에서 정수의 짝수/홀수 여부를 판단하려면 최하위 비트(LSB)를 확인하면 된다. 최하위 비트가 0이면 짝수이고, 1이면 홀수이다. 부호-절댓값 표현도 같은 성질을 가지지만, 1의 보수 표현에서는 최상위 비트(MSB)의 검사가 필요하다. 1의 보수에서는 최상위 비트가 1이면 최하위 비트가 1이고, 최상위 비트가 0이면 최하위 비트가 0일 때 짝수가 된다.10. 4. 양수/음수 판정
2의 보수로 표현되는 수는 최상위 비트(MSB)가 0이면 양수, 1이면 음수이다.[4] 즉, 음수인지 양수인지 판정은 최상위 비트만으로 가능하다.[4] 부호-절댓값 표현이나 1의 보수 표현에서는 0을 나타내는 이진수가 유일하지 않고, 최상위 비트가 0인 +0과 최상위 비트가 1인 -0이 있기 때문에, -0이 허용되는 한 이러한 표현에서는 최상위 비트만으로 음수인지 양수인지를 판정할 수 없다.10. 5. 1의 보수와의 관계
2의 보수는 1의 보수에 1을 더한 값이다.[4] 2의 보수를 구하기 위해서는 먼저 모든 비트를 반전(0을 1로, 1을 0으로)시킨 후, 1을 더한다. 비트 반전 연산은 1의 보수를 얻는 과정과 동일하다.2의 보수는 덧셈, 뺄셈, 곱셈 등의 기본적인 산술 연산이 부호 없는 이진수와 동일하게 동작한다는 장점을 가진다. 또한, 1의 보수와는 달리 음의 영이 존재하지 않아 표현의 효율성이 높다.
10. 6. 원래 수와의 비트 일치
''x''의 ''n''비트 이진수 표현에서 하위 ''m'' - 1 비트까지의 값이 0이었을 경우, 2의 보수 f|영어''x'' + 1을 구할 때, 비트 반전한 값이 자리올림에 의해 다시 반전되기 때문에, 하위 비트까지 원래 수와 그 2의 보수의 값이 일치한다. 또한 나머지 상위 ''n'' - ''M'' 비트는 비트 반전 f|영어''x''의 상위 ''n'' - ''M'' 비트와 일치한다. 예를 들어, 보수와 원래 수의 비트 값이 일치하는 부분에 밑줄을 그으면, 0의 비트 반전은 f|영어''x'' = 1이며, 2의 보수는 f|영어''x'' + 1 = 1가 된다. 마찬가지로, 및 의 비트 반전은 각각 , 이며, 2의 보수는 각각 , 가 된다(표 참조).원래 수와 일치하는 하위 비트의 자릿수 (M) | 1 | 2 | 3 | 4 | 4 |
---|---|---|---|---|---|
원래 수 (x) | B3B2B1 | B3B2 | B3 | ||
비트 반전 ({{lang|en|f|} | }''x'')