함께 배우는 수업 · 컴퓨터/정보
컴퓨터의 데이터 표현
텍스트를 저장하는 문자 인코딩(ASCII, Unicode, UTF-8)의 구조와 실수를 근사 표현하는 IEEE 754 부동소수점 표준 및 오차 원리를 다룹니다.
이 수업에서 해 볼 일
- 데이터의 비트 수와 인코딩을 구분하여 해석한다
먼저 알면 좋은 것: 2진수 소수점 변환 ($2^{-1}, 2^{-2}$ 가중치) · 과학적 기수법 (정규화 표기: $1.xxxx \times 2^e$) · 바이트(Byte)와 16진수 코드 표현
오늘의 목표
가입 없이 시작할 수 있어요. 설명을 읽고, 함께 연습한 뒤, 처음 보는 문제에서 직접 확인합니다.
1. 문자 인코딩의 발전: ASCII에서 Unicode와 UTF-8까지
- ASCII (American Standard Code for Information Interchange): - 영문 알파벳 대소문자, 숫자, 특수기호, 제어문자를 7비트(개)로 정의한 최초의 표준입니다 (예:'A' = 65(0x41), 'a' = 97(0x61), '0' = 48(0x30)).
- 영어권 외 국가들이 각자 확장 인코딩(한국 EUC-KR/CP949 등)을 만들면서 다국어 문서가 깨지는 모지바케(Mojibake) 현상이 발생했습니다.
- Unicode와 UTF-8 (가변 길이 인코딩):
- Unicode: 전 세계 모든 문자와 이모지에 고유 번호(Code Point, 예: '가' = U+AC00)를 부여한 국제 표준 사전입니다.
- UTF-8: 유니코드 번호를 실제 바이트열로 변환하는 가변 길이 인코딩(1~4바이트) 방식입니다.
- 영문·숫자(ASCII 영역): 1바이트 (기존 ASCII와 100% 하위 호환되어 네트워크 전송량 절감).
- 유럽·중동 문자: 2바이트.
- 한글·한자·일본어(CJK): 3바이트 (UTF-16에서는 한글이 2바이트이나 웹 표준인 UTF-8에서는 3바이트).
- 이모지(Emoji) 및 고대 문자: 4바이트.ASCII 코드 필수 암기값: 숫자 '0'은 48(0x30), 대문자 'A'는 65(0x41), 소문자 'a'는 97(0x61)입니다. 대문자와 소문자는 정확히 32(2^5, 즉 6번째 비트 하나)만큼 차이가 납니다.2. 실수 표현의 표준: IEEE 754 부동소수점 (Floating-Point)
실수를 형태로 정규화(Normalization)하여 소수점의 위치를 유동적으로 이동시키며 넓은 범위의 수를 표현합니다. - 32비트 단정밀도 (Single Precision,float) 구조:
1. 부호 비트 (Sign, 1비트): 양수면 , 음수면 .
2. 지수부 (Exponent, 8비트): 실제 지수 에 바이어스(Bias = 127)를 더한 값()을 부호 없는 정수로 저장합니다.
3. 가수부 (Mantissa / Fraction, 23비트): 정규화된 에서 소수점 앞의 정수 은 항상 고정되어 있으므로 생략(Hidden Bit / 묵시적 1)하고, 소수점 아래 비트열만 왼쪽부터 채워 넣습니다 (정밀도 1비트 이득!).
- 64비트 배정밀도 (Double Precision, double): 부호 1비트 + 지수부 11비트(바이어스 1023) + 가수부 52비트로 구성되어 유효숫자 약 15~17자리의 높은 정밀도를 제공합니다.예제로 살펴보기
10진수 실수 -13.625를 IEEE 754 32비트 단정밀도(float) 부동소수점 비트 패턴으로 변환하시오.- 1) 부호 비트 결정: 음수이므로 부호 비트 S = 1입니다. 2) 절댓값 13.625를 2진수로 변환: 정수부 13 = 8 + 4 + 1 = 1101₂ 소수부 0.625 = 0.5(2⁻¹) + 0.125(2⁻³) = .101₂ 따라서 13.625₁₀ = 1101.101₂입니다. 3) 정규화(소수점 앞을 1 하나로 만듦): 1101.101₂ = 1.101101₂ × 2³ (실제 지수 e = 3) 4) 지수부(8비트) 계산: Bias 127을 더하면 E = 3 + 127 = 130 = 10000010₂. 5) 가수부(23비트) 결정: 정수부 1을 생략한 소수점 이하 101101 뒤에 0을 17개 채웁니다. 결과: 1 | 10000010 | 10110100000000000000000
3. 부동소수점 반올림 오차(Round-off Error)와 실무 해결책
- 왜0.1 + 0.2 == 0.3이 False가 될까?
- 10진수 소수 을 2진수로 변환하면 처럼 이 끝없이 반복되는 무한 순환소수가 됩니다.
- 가수부의 23비트(또는 52비트) 유한한 공간에 이를 잘라 저장하면서 미세한 절단·반올림 오차가 발생하여 0.1 + 0.2 = 0.30000000000000004가 됩니다.
- 실무 및 코딩 테스트 대응 원칙:
1. 실수 동등 비교 금지: a == b 대신 두 수의 차이가 매우 작은 허용 오차(Epsilon) 이내인지 확인하는 abs(a - b) < 1e-9 방식을 사용해야 합니다.
2. 금융·결제 시스템: 단 1원의 오차도 허용되지 않는 은행·결제 도메인에서는 float/double 사용이 엄격히 금지되며, 정수형(센트/원 단위 long)으로 환산하거나 Python Decimal, Java BigDecimal 같은 10진 고정소수점 연산 객체를 사용합니다.금융/회계 프로그램이나 이커머스 정산 로직에서 float이나 double 타입을 사용하면 누적 반올림 오차로 인해 금액이 어긋나는 치명적 결함이 발생합니다. 반드시 정수(Integer)나 BigDecimal/Decimal 타입을 사용하세요.참고 근거와 확인 범위
- Harvard CS50 · Lecture 0 ↗
수·문자·영상·소리의 디지털 표현
설명·예제·문제 구성 및 오류 수정 책임: 프리런. 위 자료는 표시한 주제를 확인하거나 더 읽기 위한 근거이며, 외부 기관의 공식 수업이나 감수본을 뜻하지 않습니다.
참고 자료 연결 점검: 2026-11-02. 제작 방식·검수 범위와 수정 기록에서 확인 범위를 볼 수 있습니다. 오류는 상단의 의견 보내기 또는 contact@freelearn.io로 알려 주세요.