작성 맥락
이 글은 직접 학습하거나 구현하며 남긴 개인 기술 기록입니다. 참고 자료가 있는 경우 본문에 출처를 남기고, 틀린 부분을 발견하면 수정합니다.
컴퓨터는 숫자든 문자든 결국 0과 1로만 저장한다. 이 글은 “같은 이진수를 어떤 규칙으로 해석하느냐”에 따라 숫자·문자·음수가 어떻게 서로 다르게 표현되는지를 진법 변환부터 부동소수점까지 순서대로 따라간다.
1. 데이터 유형
- 디지털 컴퓨터의 이진 정보는 메모리나 프로세서 레지스터에 저장됨
- 주요 유형:
- 산술 연산용 숫자
- 데이터 처리용 알파벳
- 특정 목적의 기타 이산 기호
2. 수 체계
2.1 진법 변환
- 10진수: (724.5)₁₀ = 7×10² + 2×10¹ + 4×10⁰ + 5×10⁻¹
- 2진수: (101101)₂ = 1×2⁵ + 0×2⁴ + 1×2³ + 1×2² + 0×2¹ + 1×2⁰ = (45)₁₀
- 8진수: (736.4)₈ = 7×8² + 3×8¹ + 6×8⁰ + 4×8⁻¹ = (478.5)₁₀
- 16진수: (F3)₁₆ = 15×16¹ + 3×16⁰ = (243)₁₀
2.2 진법 간 변환
- 2진수 ↔ 8진수:
- (10110001101011.111100000110)₂ = (?)₈
- 3비트씩 그룹화: (010.110 001.101 011.111 100.000 110)₂
- 변환 결과: (26.1337406)₈
- 2진수 ↔ 16진수:
- (10110001101011.11110010)₂ = (?)₁₆
- 4비트씩 그룹화: (1011.0001 1010.1111 1001.0)₂
- 변환 결과: (B.1AF9)₁₆
- 8진수 ↔ 2진수:
- (673.124)₈ = (?)₂
- 각 자리를 3비트 2진수로 변환: (110 111 011 . 001 010 100)₂
- 변환 결과: (110111011.001010100)₂
- 16진수 ↔ 2진수:
- (306.D)₁₆ = (?)₂
- 각 자리를 4비트 2진수로 변환: (0011 0000 0110 . 1101)₂
- 변환 결과: (1100000110.1101)₂
2.3 10진수를 2진수로 변환
- 예: (724.5)₁₀ = (1011010100.1)₂
- 정수부: 724 ÷ 2 = 362 나머지 0, 362 ÷ 2 = 181 나머지 0, …
- 소수부: 0.5 × 2 = 1.0 (정수부 1)
- 예: (41)₁₀ = (101001)₂
- 41 ÷ 2 = 20 나머지 1, 20 ÷ 2 = 10 나머지 0, …
- 예: (0.6875)₁₀ = (0.1011)₂
- 0.6875 × 2 = 1.3750 (정수부 1), 0.3750 × 2 = 0.7500 (정수부 0), …
3. 코드화된 수 체계
3.1 이진화된 8진수
- 예: (1 010 111 101 100 011)₂ = (127543)₈
- 각 3비트 그룹을 8진수 한 자리로 변환
3.2 이진화된 16진수
- 예: (1010 1111 0110 0011)₂ = (AF63)₁₆
- 각 4비트 그룹을 16진수 한 자리로 변환

이진수 → 8진수/16진수 변환표. 그룹 비트 수만 다를 뿐 원리는 동일하다.
3.3 이진화된 10진수 (BCD)
- 4비트 조합으로 10진 숫자 하나를 표현
- 예: (10010011)BCD = (93)₁₀
- 1001 = 9, 0011 = 3

4. 문자 표현
4.1 영숫자 표현
- ASCII (American Standard Code for Information Interchange)
- 7비트 코드, 8번째 비트는 패리티용
- 128개 문자 포함 (2⁷ = 128)
- 예: ‘A’ = 1000001 (ASCII)
- ASCII를 BCD로 변환: 상위 011 비트 제거
5. 보수
5.1 r의 보수
- 정의: r진법의 n자리 수 N에 대해, r의 보수는 r^n - N (N ≠ 0일 때)
- 10의 보수: 10진수에서 사용
- 2의 보수: 2진수에서 사용
5.2 (r-1)의 보수
- 정의: r진법의 n자리 수 N에 대해, (r-1)의 보수는 (r^n - 1) - N
- 9의 보수: 10진수에서 사용
- 1의 보수: 2진수에서 사용
5.3 보수 계산 방법
- 9의 보수: 각 자리 숫자를 9에서 뺌
- 예: 546700의 9의 보수 = 999999 - 546700 = 453299
- 1의 보수: 각 비트를 반전
- 예: 1011001의 1의 보수 = 0100110
- 2의 보수: 1의 보수에 1을 더함
- 예: 1011001의 2의 보수 = 0100110 + 1 = 0100111
- 단축법: 오른쪽부터 첫 1까지 그대로 쓰고, 나머지 비트 반전
5.4 보수를 이용한 뺄셈
- A - B = A + B’(10의 보수)
- 예: 72532 - 13250 = 72532 + 86750 = 159282
- 끝자리 올림(End Carry) 100000 버림
- 결과: 59282
- 음수 결과 처리:
- 끝자리 올림이 없으면 결과를 다시 보수로 취하고 음수 부호를 붙임
- 예: 13250 - 72532 = 13250 + 27468 = 40718
- 40718의 10의 보수: 59282
- 최종 결과: -59282
6. 컴퓨터에서의 수 표현
6.1 부호 비트
- 가장 왼쪽 비트를 부호 비트로 사용
- 0: 양수, 1: 음수
6.2 고정 소수점
- 소수점 위치가 항상 동일
- 분수 표현: 소수점을 레지스터 맨 왼쪽에 둠
- 정수 표현: 소수점을 레지스터 맨 오른쪽에 둠
6.3 부동 소수점
- 소수점 위치가 가변적
- 첫 번째 레지스터: 10진 소수점 위치
- 두 번째 레지스터: 숫자 값
6.4 음수 표현 방식
- 부호-크기 표현
- 예: -14 (8비트) = 1 0001110
- 부호화된 1의 보수 표현
- 예: -14 (8비트) = 1 1110001
- 부호화된 2의 보수 표현
- 예: -14 (8비트) = 1 1110010

7. 산술 연산
7.1 덧셈
- 2의 보수 표현에서는 부호 비트를 포함하여 더함
- 부호 비트의 올림은 무시
- 예: (+6) 00000110 (-6) 11111010 합: 00000000
7.2 뺄셈
- 감수의 2의 보수를 취한 후 덧셈 수행
- 예: (-6) - (-13) = (-6) + (+13) 11111010 (2의 보수 표현 -6) 00001101 (+13) 합: 100000111 (끝자리 올림 무시) 결과: 00000111 (+7)
7.3 오버플로우
- n자리 두 수의 합이 n+1자리가 될 때 발생
- 부호 있는 수에서는 마지막 두 올림(Carry In, Carry Out)을 XOR하여 검사
- 예: 8비트 레지스터에서 70 + 80 01000110 (+70) 01010000 (+80) 10010110 (결과, 오버플로우 발생) Carries: 01 (XOR 결과 1, 오버플로우 발생)
8. 부동 소수점 표현
8.1 구성
- 가수(Mantissa)와 지수(Exponent)로 구성
- m × r^e 형태 (m: 가수, e: 지수, r: 기수)
- 예: +6132.789 표현
- 가수: +0.6132789
- 지수: +04
8.2 정규화
- 가수의 가장 왼쪽 숫자가 0이 아니도록 조정
- 예: 2진수 +1001.11
- 8비트 가수, 6비트 지수로 표현
- 정규화: 01001110 (가수), 000100 (지수)
8.3 부동 소수점 연산
- 일반 고정 소수점 연산보다 복잡하고 시간이 오래 걸림
- 과학 계산에 필수적
9. 기타 코드
9.1 그레이 코드
- 연속된 숫자 간 1비트만 변경
- 제어 연산에 사용 가능. 일반 이진수 카운터는 값이 바뀔 때 여러 비트가 동시에 바뀔 수 있어 순간적으로 잘못된 중간값이 읽힐 위험이 있는데, 그레이 코드는 인접한 값끼리 항상 1비트만 달라서 이 문제가 원천적으로 없다.

9.2 기타 10진 코드
- 10진 숫자 표현에 최소 4비트 필요
- 예: 2421 코드, 5421 코드, Excess-3 코드

10. 오류 검출
10.1 패리티 비트
- 가장 일반적인 오류 검출 코드
- 예: 데이터 1011 → 패리티 비트 1 → 전송 11011

- 패리티 비트는 전송되는 데이터 비트들에 추가로 붙는 비트로, 보통 짝수 패리티나 홀수 패리티 방식이 있습니다.
- 예를 들어, 짝수 패리티의 경우 전송되는 데이터의 비트 합이 짝수가 되도록 패리티 비트를 설정합니다.
- 이를 통해 데이터가 전송되는 과정에서 오류가 발생했는지 간단히 확인할 수 있습니다. 다만 패리티 비트는 “비트가 몇 개 뒤집혔는가”만 짐작하게 해줄 뿐 “어느 비트가 틀렸는지”는 알려주지 못하고, 짝수 개의 비트가 동시에 뒤집히면 아예 탐지하지 못한다는 한계가 있다 — 그래서 더 정교한 오류 정정이 필요한 통신에서는 체크섬이나 CRC 같은 방식을 추가로 쓴다.
핵심 정리
- 같은 비트 나열도 “무엇으로 해석하느냐”(부호 있는 정수, BCD, 문자, 부동소수점…)에 따라 완전히 다른 값이 된다.
- 진법 변환은 2진수를 3비트/4비트씩 묶으면 각각 8진수/16진수로 바로 대응된다는 규칙 하나로 대부분 해결된다.
- 오류 검출(패리티)과 오류 정정은 별개의 문제다 — 패리티는 “이상 여부”만 알려주고, 어디가 어떻게 틀렸는지는 더 강한 코드가 있어야 알 수 있다.
댓글이 보이지 않으면 GitHub에 로그인한 뒤 새로고침해 주세요. 공개 댓글은 로그인 상태에서 더 안정적으로 표시됩니다.