대학 수업에서 분명히 들었고 그 당시에는 잘 기억이 났지만 지금은 잘 가물가물해서 다시 정리해보기
개요
컴퓨터는 알다시피 수를 0과 1로만 표현할 수 있다.
따라서 음수를 표현할 때는 첫 번째 비트를 부호 표현을 위해 따로 배정한다.
이때 해당 비트는 MSB(Most Significant Bit) 또는 Sign Bit이라고 불린다.
(8bit의 경우 index 8-1번째 bit이다) (index는 0부터 시작하므로)
- MSB = 0: 양수 (Positive Number)
- MSB = 1: 음수 (Negative Number)
예를 들어, 8비트 시스템에서:
- 00000101 → MSB = 0, 이는 +5를 의미.
- 11111011 → MSB = 1, 이는 -5를 의미 (2의 보수 일 때)(보수 표현 방식에 따라 다름).
라고 표현하게 되는 것이다.
지금 위에 보면 단순하게 1을 붙여서 음수를 표현한 것이 아니라 다른 방식을 사용했는데 굳이 이렇게 하는 이유는 아래와 같다.
표현 방법
1. 부호 크기(sign magnitude) 방식
MSB 로만 표현하는 방법이다.
예시 (4비트):
- +3 → 0011
- -3 → 1011 (MSB = 1, 부호 비트)
장점: 딱 봐도 우리가 이해하기 쉬움
단점: 덧셈과 뺄셈 처리가 복잡하며, 0이 +0과 -0 두 가지로 표현됨.
++ 부호 크기 방식의 경우 부호와 크기가 별도로 저장되므로 음수를 계산하거나 해석할 때 크기를 해석하는 추가 과정이 필요하다. (하드웨어 적으로 비용이 더 발생)
2. 1의 보수 방식
일반적으로 적은 정수 표현 방식에서 0->1 1->0으로 뒤집어 표현하는 방식
예시 (4비트):
- +3 → 0011
- -3 (1의 보수) → 1100
기존의 수를 1과 XOR 시키면 비트 반전이 가능하기 때문에 하드웨어 적으로 적은 비용으로 처리가 가능하다.
0011 (+3)
+ 1100 (-3)
-------
1111 (결과: -0, MSB = 1)
여전히 0이 +0과 -0 두 가지로 표현된다.
3. 2의 보수 방식
2의 보수 방식은 1의 보수 방식의 단점을 해결하기 위해 등장했다. 1의 보수 방식에서 1을 더하는 단순한 개선을 통해 중복된 0 문제와 연산 복잡성을 해결했다.
처음 제안한 사람은 폰 노이만이라고 한다.
교수님들한테 이래저래 대단한 사람이라고 많이 들었었는데, 찾다 보면 다 폰 노이만 출처인 거 보니 진짜 신기하다.
https://en.wikipedia.org/wiki/Two%27s_complement
2의 보수 방식의 계산법:
- 주어진 양수의 이진수를 반전(1의 보수 계산).
- 반전된 값에 1을 더함.
예시 (4비트):
- +3 → 0011
- -3 (2의 보수) → 1101
따라서 2의 보수는 XOR 게이트와 전가산기를 통해서 구현된다.
2의 보수 방식에서 음수 소수점은 고정소수점 또는 부동소수점 방식을 사용해 구현한다.
보수
보수는 보충해주는 수이다.
n의 보수라고 하면 n을 만들기 위해서는 숫자 몇이 필요한가를 생각해보면 된다.
예를 들어 3의 10의 보수라면 3 + x = 10 인 x = 7이 보수이다.
다만 2의 보수는 이진수와 관련된 보수라고 보면 된다.
연산 방법
기본적으로 정수 연산은 CPU의 ALU에서 하기 때문에 ALU의 크기에 맞춰서 연산한다.
예를 들어 현재 가장 많이 사용되는 64비트 운영체제라고 한다면, 64비트 크기의 메인 레지스터를 사용하는 것이고,
대부분 메인 레지스터와 ALU의 크기는 같기 때문에 ALU도 64비트의 용량을 가진다.
64비트 CPU에서 8비트, 16비트, 32비트 데이터를 처리할 경우에도 64비트 ALU를 사용한다. 작은 데이터 크기의 경우:
- 상위 비트를 0으로 채우거나(부호 없는 데이터) 부호 확장(Sign Extension)을 적용한다(부호 있는 데이터).
- 효율성: ALU는 한 번의 연산으로 데이터 크기와 상관없이 동일한 속도로 처리한다.
부호 있는 연산의 경우 오버플로가 발생할 수 있다. 물론 64비트 부호 있는 정수의 경우 2의 63승 - 1은 약 9경이므로 일반적으로 범위 내에서 계산이 이루어지므로 오버플로가 발생할 가능성이 낮긴 하다.
다만 예시를 통해 보면
예를 들어 +127 + 1을 한다면
따라서 오버플로가 발생하는데
CPU에서는 플래그 레지스터의 Overflow Flag를 통해 발생 여부를 기록하고, 프로세서는 연산 이후 오버플로 플래그를 통해 결과를 검사할 수 있다.
새롭게 생각나거나 궁금한 것들이 생기면 계속 수정할 예정
사진도 추가해야지
'CS > CA, OS' 카테고리의 다른 글
컴퓨터의 시간측정 (0) | 2025.04.29 |
---|---|
컴퓨터의 CPU (2) - 레지스터 (0) | 2025.04.19 |
컴퓨터의 프로세스 (0) | 2025.04.05 |
컴퓨터의 CPU (1) (0) | 2025.01.20 |
컴퓨터의 RAM (0) | 2024.12.26 |