알아둘 것
편집- 이 문서에서는 정규표현식이 사용되기도 하므로, 주의를 기울여 봐야합니다.
- 이후부터는 딱딱한 어체로 글을 작성합니다.
지킬 것
편집- 문서를 저장할 때는 꼭 "미리보기"를 하고, 꼼꼼히 살필 것.
- "사소한 편집"을 주의!
- 편집요약에 「.+어 위키백과의 ".+" 문서의 "yyyy년 mm월 dd일 hh시 mm분" 버전을 참조하였습니다.」라는 내용을 넣을 것.
참고 문서
편집다음 번역 대상
편집- Signed number representations (符号付数値表現)
- 음의 정수, 正の数と負の数, Negative and non-negative numbers
- Gray code ...?
- ダイナミックドメインネームシステム
- 연산 오버플로
해야할 것
편집- 양수와 음수 문서가 만들어졌다면,
- 부호 있는 수 표현에서 「[[양수 (수학)|양]]과 [[음의 정수|음]]」을 아래와 같이 수정한다.
- 「[[양수와 음수|양과 음]]」
- 부호 있는 수 표현 : Offset binary의 한국 표기는 해당 토론을 참고한다.
- 부호 있는 수 표현 : '연산 오버플로'라는 말을 '올림수'로 바꾸는 것에 대해 고려.
- 부호 있는 수 표현 : '부호-가수부' 대신에 사용할 만한 것을 고려.
번역 중 (부호 있는 수 표현, 符号付数値表現, Signed number representations)
편집부호 있는 수 표현이란 것은, 컴퓨터 내부에서 수의 양과 음을 표현하는 방법이다. (즉 수가 0보다 큰가 작은가를 표현하는 방법이다.)
수학에서는 일반적으로 마이너스 기호인 "−"를 수의 앞에 붙이는 것으로 음수를 표현한다. 하지만, 컴퓨터에서는 음수를 나타내는 방법이 여러가지이다. 여기서는 이진법을 확장해 음수를 나타내는 방법 4가지(부호-가수부, 1의 보수, 2의 보수, 오프셋 바이너리(Offset binary))를 설명한다.
대부분의 최근 컴퓨터들은 2의 보수 표현 방법을 주로 사용하지만, 다른 표현 방법이 전혀 쓰이지 않는 것은 아니다.
부호-가수부
편집비트 패턴 | 부호-가수부 표현 | 부호 없는 표현 |
---|---|---|
00000000 | 0 | 0 |
00000001 | 1 | 1 |
00000010 | 2 | 2 |
... | ... | ... |
01111111 | 127 | 127 |
10000000 | −0 | 128 |
10000001 | −1 | 129 |
10000010 | −2 | 130 |
... | ... | ... |
11111111 | −127 | 255 |
이진수에 부호를 붙이는 문제를 생각했을 때 처음 떠올릴 수 있는 것은 부호 비트를 추가해서 양수, 음수를 나타내는 것이다. 부호 비트(보통 최상위 비트(MSB))가 0이면 양의 수를 나타내고, 1이면 음수를 나타내며, 나머지 비트열은 그 수의 가수부(또는 절대값)가 된다. 1바이트로 수를 나타내는 경우에 부호로 1비트를 사용하므로, 나머지 7비트로 나타낼 수 있는 가수부의 범위는 0000000(0) ~ 1111111(127)이 된다. 따라서 1바이트로 나타낼 수 있는 수의 범위는 −12710 ~ +12710이 된다. 결과적으로, 이 표현 방법에서는 2종류의 0이 있다(00000000(0)과 10000000(−0)). 십진수 −43을 이 방법으로 표현하면 10101011이 된다.
이 방법은 보통의 부호 표시 방법(숫자열 앞에 "+"나 "−"를 부여하는 방법) 그대로라고 말할 수 있다. 초기의 이진 컴퓨터(예를 들면 IBM7090) 중에는 이 표현 방법을 채용했던 것도 있다. 아마도 일반적인 표현 방법으로부터 자연스럽게 연상된 것이라고 생각된다. 또, 많은 10진 컴퓨터는 부호-가수부를 사용하고 있다.
1의 보수
편집비트 패턴 | 1의 보수 표현 | 부호 없는 표현 |
---|---|---|
00000000 | 0 | 0 |
00000001 | 1 | 1 |
... | ... | ... |
01111101 | 125 | 125 |
01111110 | 126 | 126 |
01111111 | 127 | 127 |
10000000 | −127 | 128 |
10000001 | −126 | 129 |
10000010 | −125 | 130 |
... | ... | ... |
11111110 | −1 | 254 |
11111111 | −0 | 255 |
이진수에서의 1의 보수 표현이라는 것은, 양수의 1의 보수로 음수를 나타내는 것이다. 즉 음수를 표현할 때, 음수의 절대값에 비트 단위로 NOT을 적용하여 음수를 표현한다. 예를 들면, 00101011(43)의 1의 보수는, 11010100(−43)이다.
부호-가수부 표현 처럼, 1의 보수 표현에서도 2종류의 0이 있으며(00000000(+0), 11111111(−0)), 1바이트에서 1의 보수 표현으로 나타낼 수 있는 수의 범위는 −12710 ~ +12710이다.
이 방법에서 두개의 수를 더하려면, 먼저 보통의 이진수 덧셈을 한 뒤, 연산의 결과로 나온 캐리(연산 오버플로)를 다시 더할 필요가 있다. 예를 들어 −1(11111110)와 +2(00000010)을 더해보면, 연산 결과로 00000000과 1(캐리)이 나오게 된다. 즉 단지 이진수를 그대로 더하기만 해서는 0(00000000)이라는 잘못된 답이 나오게 된다. 여기에 연산 오버플로인 1을 더하게 되면, 바른 답인 +1(00000001)이 나오게 된다.
이 방법은 옛날 컴퓨터에서 흔한 방법이었다. PDP-1라던가 UNIVAC 1100/2200 series 등 많은 시스템이 1의 보수 방법을 사용했었다.
덧붙여, 「1의 보수」는 영어로 "ones' complement"이며, 「2의 보수」가 "two's complement"로 표기되는 것과 비교해 보았을 때, 아포스트로피(')의 위치가 다른 것을 알 수 있다. 이것은 1의 보수가 실제로는 모든 자리의 값이 1인 비트열에서 원래의 수를 빼는 것으로 부호를 반전 시키기 때문이다. 반면, 2의 보수는 2의 거듭제곱에서 원래의 수를 빼서 부호를 반전시킨다.[1] (이것에 대한 자세한 설명은 2의 보수에서 설명하겠다.)
참고로 부호-가수부 표현에서 음수의 가수부를 각 비트마다 반전시키면, 1의 보수 표현으로 변환된다.
- ↑ 도널드 크누스 컴퓨터 프로그래밍의 예술, Volume 2: 4.1절