computer_science/computer_architecture

[컴퓨터구조] 02. 데이터의 표현

렁치 2026. 7. 8. 08:30

컴퓨터는 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 (실제 사용)

 

왜 하필 2의 보수인가?
A - B를 A + (B의 2의 보수) 로 계산할 수 있기 때문이다. 즉 뺄셈을 덧셈으로 바꿀 수 있어, 덧셈기 회로 하나로 더하기와 빼기를 모두 처리한다. 회로가 단순해지는 이 이점 때문에 컴퓨터는 2의 보수를 표준으로 채택했다.

 

처음엔 "왜 굳이 보수라는 걸 쓰나" 싶었는데, 뺄셈을 덧셈 회로 하나로 처리하려는 거라는 이유를 알고 납득됐다. 표현 방식이 회로 설계와 직결된다는 게 컴퓨터구조다웠다.

8비트 2의 보수로 표현할 수 있는 범위는 -128 ~ +127이다(음수가 양수보다 하나 더 많은 게 특징이다). MSB가 1이면 음수이므로, 2의 보수로 다시 변환해 크기를 구한 뒤 음수 부호를 붙여 읽는다.


3. 실수 표현: 부동소수점

소수점을 다루는 방식은 둘이다.

  • 고정소수점: 소수점 위치를 미리 고정한다(예: 정수부 4비트 + 소수부 4비트). 단순하지만 표현 범위가 좁다.
  • 부동소수점: 소수점 위치를 가변으로 두고, 가수부(유효숫자)지수부(소수점 위치)로 나눠 표현한다. 매우 크거나 작은 수까지 다룬다.

 

IEEE 754 (32비트 단정도)
부호(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코드, 통신 등이 모두 잡음 속에서 데이터를 지키려고 해밍 코드 계열의 기법을 쓴다. "비트는 언제든 틀어질 수 있다"는 전제 위에서 신뢰성을 쌓아 올리는 것이다.