일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- SQL
- string
- list
- c#
- gas
- Python
- Excel
- Github
- PySpark
- Tkinter
- dataframe
- matplotlib
- array
- Google Spreadsheet
- PANDAS
- Java
- 파이썬
- Mac
- GIT
- numpy
- google apps script
- Redshift
- Apache
- Kotlin
- math
- PostgreSQL
- Google Excel
- django
- hive
- Today
- Total
달나라 노트
2진수의 음수표현 (부호 절대값, 1의 보수, 2의 보수) 본문
컴퓨터와 같이 기계에서 2진수의 음수를 표현하는 방법을 알아봅시다.
1. 부호 절대값 방식
부호 절대값 방식은 2진수의 가장 왼쪽에 존재하는 0 또는 1값을 + 또는 - 부호로 인식하는 방식입니다.
컴퓨터를 이용할 때 32비트인지 64비트인지 같은 말을 들어보셨나요?
간단하게 말하면 내 컴퓨터가 32비트라면 기본적으로 32자리의 2진수를 가지고 연산을 한다는 의미입니다.
32비트까지 가면 너무 복잡해지니까 8비트를 예로 들어보겠습니다.
00000000
00000001
00000010
00000011
00000100
...
11111111
8비트인 경우 위처럼 8자리의 이진수를 의미합니다.
그리고 8자리의 이진수로 나타낼 수 있는 숫자는 위와 같죠.
컴퓨터는 음수 표현을 위해 8자리 중 가장 왼쪽에 있는 한 자리는 부호로 사용합니다.
즉, 8비트 방식에서 표현할 수 있는 정수는 아래와 같습니다.
00000000 -> +0
00000001 -> +1
00000010 -> +2
00000011 -> +3
...
01111111 -> +127
10000000 -> -0
10000001 -> -1
10000010 -> -2
10000011 -> -3
...
11111111 -> -127
가장 왼쪽 자리를 부호로 사용하기 때문에 총 8자리 중 실제 숫자를 나타낼 수 있는 자릿수는 7자리입니다.
7자리의 이진수라면 0 ~ 127 사이의 숫자죠.
그러면 이 숫자가 양수와 음수에 하나씩 있을테니 결국 -127 ~ 127 사이의 숫자를 표현할 수 있는 것입니다.
2. 1의 보수 방식
마찬가지로 8비트를 기준으로 예시를 들어보겠습니다.
1의 보수 방식은 음수의 표현을 할 때 어떤 양의 2진수를 11111111에서 빼는 것입니다.
예를들어 x라는 양의 2진수를 음수로 바꾸려면 11111111 - x를 하는 것이죠.
11111111 - x라는 것의 의미는 x의 1 또는 0을 모두 반전시키는 것과 같습니다.
아래 예시를 보시죠.
00001010 -> +10
11111111
- 00001010
= 11110101 -> -10
따라서
00001010 -> +10
11110101 -> -10
8비트에서 10을 이진수로 바꾸면 00001010입니다.
1의 보수 방식을 이용해서 -10을 나타내려면 11111111 - 00001010을 하면 됩니다.
그 결과는 00001010의 각 자리수를 모두 반전시킨 11110101이며 이것이 -10을 의미합니다.
00000000 -> +0
11111111 -> -0
00000001 -> +1
11111110 -> -1
00000010 -> +2
11111101 -> +2
00000011 -> +3
11111100 -> -3
00000100 -> +4
11111011 -> -4
...
01111111 -> +127
10000000 -> -127
1의 보수 방식을 이용했을 때 8비트 조건 하에서 표현할 수 있는 모든 경우의 수는 위와 같습니다.
어떤 양수를 나타내는 2진수에 대해 1의 보수 방식으로 음수를 나타내는 2진수가 존재합니다.
따라서 최대로 나타낼 수 있는 숫자는 +127입니다.
왜냐면 8자리로 나타낼 수 있는 모든 경우의 수는 2^8 = 256인데 양수와 음수가 쌍을 이뤄야하므로 256 / 2 = 128개의 쌍이 존재합니다.
하지만 이 쌍은 위 예시에서처럼 +0과 -0의 쌍도 존재합니다.
근데 실제 10진수에서는 +0이건 -0이건 똑같죠.
따라서 128에서 중복되는 0의 경우 중 하나를 뺀 127개가 표시 가능한 양의 정수가 됩니다.
주의할 점은
01111111 -> 이게 127인건 알겠는데
10000000 -> 이 2진수를 10진수로 바꾸면 128아니냐 라고 생각할 수 있습니다.
맞습니다. 수학적으로 보면 2진수 10000000은 128입니다. -127이 아닙니다.
근데 이건 컴퓨터입니다.
8비트 컴퓨터에서는 10000000을 -127이라고 하기로 약속한겁니다.
11111110도 위 예시에서는 -1이라고 했는데 사실 이걸 수학적인 2진수로 보고 10진수로 바꾸면 254입니다.
근데 11111110을 -1이라고 하는 것은 8비트 컴퓨터에 적용되어있는 약속입니다.
그리고 이렇게 2진수로 음수를 나타내는 규칙을 1의 보수 방식으로 한 것이구요.
3. 2의 보수 방식
2의 보수 방식은 1의 보수 방식과 비슷하면서도 다릅니다.
x라는 양의 2진수를 음수로 바꾸려면 10000000 - x를 하는 것이 2의 보수 방식입니다.
이것은 1의 보수 방식처럼 x의 모든 자리를 반전시킨 후 +1을 하면 됩니다.
00001010 -> +10
10000000
- 00001010
= 11110110 -> -10
따라서
00001010 -> +10
11110110 -> -10
+10을 이진수로 나타내면 1010입니다. 하지만 8비트 컴퓨터이기때문에 비어있는 네 자리는 0으로 채워서 00001010이 되죠.
2의 보수 방식을 이용해서 -10을 표시하려면 10000000 - 00001010을 하면 됩니다.
이걸 직접 계산해도 되지만 쉽게 계산하는 방법은 00001010의 모든 자리수를 반전시킨 11110101에서 +1을 하면 됩니다.
그러면 11110110이 나오는 것을 볼 수 있습니다.
00000000 -> +0
00000001 -> +1
11111111 -> -1
00000010 -> +2
11111110 -> +2
00000011 -> +3
11111101 -> -3
00000100 -> +4
11111100 -> -4
...
01111111 -> +127
10000001 -> -127
위 내용은 2의 보수 방식을 이용한 8비트에서 숫자를 표시하는 경우의 수 입니다.
3을 예시로 보면
+3은 00000011입니다.
-3은 이 모든걸 반전시킨 11111100에서 1을 더한 11111101입니다.
2의 보수 방식의 특징은 바로 0에 있습니다.
1의 보수 방식에서는 00000000이 +0을 의미하고 11111111이 -0을 의미해서 동일한 0이라는 숫자를 두 종류의 2진수가 가르키고 있었습니다.
하지만 2의 보수 방식을 이용하면 +0이 00000000이고 이걸 음수로 바꾸는 규칙을 따랐을 때 모든걸 반전시킨 후 1을 더해봅시다.
11111111 + 1 = 100000000입니다.
근데 문제는 이렇게 된 경우 총 9자리가 됩니다. 8비트라서 총 8자리까지밖에 다루지 못하는데말이죠.
따라서 2의 보수 방식에서는 -0이라는 것이 정의되지 않습니다.
이것이 2의 보수 방식의 장점인데 1의 보수처럼 +0과 -0 각각에 2진수 경우의 수를 할당하지 않아도 된다는 것입니다.
이러한 이유때문에 2의 보수 방식은 가장 자주 사용되는 방식입니다.
다음은 저의 32비트 컴퓨터에서 10과 -10을 각각 2진수로 변경했을 때 어떻게 출력되는지를 나타낸 것입니다.
+10 -> 1010
-10 -> 11111111111111111111111111110110
32비트이기 때문에 자리수는 총 32자리입니다.
+10은 당연히 일반적인 이진수처럼 1010이 됩니다. 1010 왼쪽에 0은 모두 생략되었기 때문에 1010만 표시됩니다.
그리고 -10을 2진수로 나타낸 것으로 보아 1010을 단순히 반전시킨 것과는 다릅니다.
1010을 반전시킨 후 1을 더해야 나오는 숫자이기 때문에 제 컴퓨터는 2의 보수 방식을 사용한다는 것을 알 수 있습니다.
'ETC' 카테고리의 다른 글
폰트, Font, TTF, OTF (0) | 2024.03.07 |
---|---|
분산, 표준편차 (0) | 2024.02.20 |
Window : Window IP 주소 확인 (IP, 윈도우 IP 주소, IP Address) (0) | 2022.02.23 |
Chrome 기본 언어 설정 (0) | 2022.02.10 |
Markdown : Markdown 사용법 알아보기 (0) | 2021.11.22 |