[컴퓨터구조] 02. 데이터의 표현
컴퓨터는 0과 1만 안다. 그렇다면 음수, 소수, 한글은 어떻게 표현할까? 오늘은 정수(2의 보수), 실수(부동소수점), 문자(ASCII·유니코드)가 비트로 어떻게 표현되는지, 그리고 오류를 어떻게 잡아내는지를 정리했다.
1. 자료 표현 단위
| 단위 | 크기 |
|---|---|
| 비트(bit) | 0 또는 1 |
| 바이트(byte) | 8비트 |
| 워드(word) | CPU가 한 번에 처리하는 비트 묶음 |
표현 대상에 따라 방식이 다르다. 정수는 2의 보수, 실수는 부동소수점(IEEE 754), 문자는 ASCII·유니코드를 쓴다.
2. 음수 표현: 2의 보수
음수를 표현하는 방식은 여러 가지지만, 실제 컴퓨터는 2의 보수를 쓴다. 최상위 비트(MSB, Most Significant Bit)가 부호를 나타낸다(0은 양수, 1은 음수).
| 방식 | 특징 |
|---|---|
| 부호-크기 | MSB가 부호, 나머지가 크기 |
| 1의 보수 | 비트를 반전 |
| 2의 보수 | 1의 보수 + 1 (실제 사용) |
A - B를 A + (B의 2의 보수) 로 계산할 수 있기 때문이다. 즉 뺄셈을 덧셈으로 바꿀 수 있어, 덧셈기 회로 하나로 더하기와 빼기를 모두 처리한다. 회로가 단순해지는 이 이점 때문에 컴퓨터는 2의 보수를 표준으로 채택했다.
처음엔 "왜 굳이 보수라는 걸 쓰나" 싶었는데, 뺄셈을 덧셈 회로 하나로 처리하려는 거라는 이유를 알고 납득됐다. 표현 방식이 회로 설계와 직결된다는 게 컴퓨터구조다웠다.
8비트 2의 보수로 표현할 수 있는 범위는 -128 ~ +127이다(음수가 양수보다 하나 더 많은 게 특징이다). MSB가 1이면 음수이므로, 2의 보수로 다시 변환해 크기를 구한 뒤 음수 부호를 붙여 읽는다.
3. 실수 표현: 부동소수점
소수점을 다루는 방식은 둘이다.
- 고정소수점: 소수점 위치를 미리 고정한다(예: 정수부 4비트 + 소수부 4비트). 단순하지만 표현 범위가 좁다.
- 부동소수점: 소수점 위치를 가변으로 두고, 가수부(유효숫자)와 지수부(소수점 위치)로 나눠 표현한다. 매우 크거나 작은 수까지 다룬다.
부호(Sign) 1비트 + 지수부(Exponent) 8비트 + 가수부(Mantissa) 23비트로 실수를 표현하는 표준이다. 예를 들어 1.101 × 2³ 같은 형태로 정규화해 저장한다.
한정된 비트로 무한한 실수를 표현하다 보니, 0.1 같은 값도 정확히 저장되지 않고 근삿값으로 들어간다. 그래서 0.1 + 0.2가 정확히 0.3이 아닌 경우가 생긴다. 표현 범위를 넘으면 오버플로, 너무 작아 표현 못 하면 언더플로가 발생한다.
0.1 + 0.2 ≠ 0.3을 코드로만 신기하게 여겼는데, 한정된 비트로 무한한 실수를 근삿값으로 담는 구조 때문이라는 걸 알고 나서야 원인이 보였다. 프로그래밍 언어들에서 겪던 함정의 뿌리가 여기 있었다.
4. 문자 표현과 오류 검출
문자는 코드 체계로 표현한다.
- ASCII (American Standard Code for Information Interchange): 7비트로 128개 문자(영문·숫자·기호).
- Unicode: 전 세계 다국어를 표현하는 확장 체계.
데이터 전송·저장 중 비트가 뒤집히는 오류를 잡는 방법도 있다.
| 방법 | 설명 |
|---|---|
| 패리티 비트 | 1의 개수를 짝수/홀수로 맞춤. 1비트 오류 검출만 |
| 해밍 코드 | 오류 검출에 더해 정정까지 가능 |
패리티는 "오류가 있다"는 것만 알려주지만, 해밍 코드는 "어느 비트가 틀렸는지" 찾아 고친다. 검출과 정정은 다른 차원의 능력이라는 점이 핵심이었다.
오늘 느낀 점
- 2의 보수가 "뺄셈을 덧셈으로 바꾼다"는 회로 단순화를 위해 채택됐다는 데서, 데이터 표현이 하드웨어 설계와 직결된다는 컴퓨터구조의 관점이 잡혔다.
- 그동안 여러 언어에서 만난
0.1 + 0.2 ≠ 0.3함정의 뿌리가 부동소수점 비트 표현이었다는 걸 알고, 표면의 버그와 밑바닥 원리가 이어졌다. - 오류 검출(패리티)과 정정(해밍)이 다른 차원이라는 점에서, "비트는 언제든 틀어질 수 있다"는 전제 위에 신뢰성을 쌓는 발상을 배웠다.
한 걸음 더
- 2의 보수가 -128~127로 음수가 하나 더 많은 건, 0이 양수 쪽에 한 자리를 차지하기 때문이다. 0이 "+0 하나"로만 표현되어(부호-크기 방식은 +0과 -0이 따로 있었다) 0의 중복이 없어진 것도 2의 보수의 장점이다. 작은 설계 선택이 일관성을 만든다.
- "0.1 + 0.2 ≠ 0.3" 문제는 거의 모든 언어에서 나타나는 부동소수점의 본질적 한계다. 그래서 돈 계산처럼 정확도가 중요한 곳에서는 부동소수점 대신 정수(센트 단위)나 십진 전용 타입(BigDecimal 등)을 쓴다. 컴퓨터구조의 비트 표현을 알면 이런 실무 선택의 이유가 보인다.
- 오류 검출·정정 코드는 추상적 이론이 아니라 도처에 쓰인다. 메모리(ECC RAM), QR코드, 통신 등이 모두 잡음 속에서 데이터를 지키려고 해밍 코드 계열의 기법을 쓴다. "비트는 언제든 틀어질 수 있다"는 전제 위에서 신뢰성을 쌓아 올리는 것이다.