데이터 표현 기초

데이터 표현 기초

개요

컴퓨터는 모든 데이터를 0과 1의 이진수로 표현합니다. 이 레슨에서는 진법의 개념, 진법 변환 방법, 데이터 단위, 그리고 보수의 개념을 학습합니다. 이는 컴퓨터가 데이터를 어떻게 처리하는지 이해하는 기초가 됩니다.

난이도: ⭐ (기초)


목차

  1. 진법의 이해
  2. 이진수 (Binary)
  3. 8진수 (Octal)
  4. 16진수 (Hexadecimal)
  5. 진법 변환
  6. 데이터 단위
  7. 보수의 개념
  8. 연습 문제

1. 진법의 이해

진법(Number System)이란?

진법은 수를 표현하는 방식으로, 기수(radix 또는 base)를 사용하여 숫자를 나타냅니다.

┌─────────────────────────────────────────────────────────┐
│                     진법의 종류                          │
├─────────────┬─────────┬─────────────────────────────────┤
│   진법      │  기수   │         사용하는 숫자            │
├─────────────┼─────────┼─────────────────────────────────┤
│  2진법      │   2     │  0, 1                           │
│  8진법      │   8     │  0, 1, 2, 3, 4, 5, 6, 7         │
│  10진법     │   10    │  0, 1, 2, 3, 4, 5, 6, 7, 8, 9   │
│  16진법     │   16    │  0-9, A, B, C, D, E, F          │
└─────────────┴─────────┴─────────────────────────────────┘

자릿값(Place Value)의 원리

모든 진법에서 각 자리는 기수의 거듭제곱 값을 가집니다.

10진수 1234 자릿값:
    1    2    3    4
   10³  10²  10¹  10
 =1000 =100  =10   =1

1234 = 1×10³ + 2×10² + 3×10¹ + 4×10
     = 1000 + 200 + 30 + 4
     = 1234

2진수 1101 자릿값:
    1    1    0    1
   2³   2²   2¹   2
   =8   =4   =2   =1

1101 = 1×2³ + 1×2² + 0×2¹ + 1×2
      = 8 + 4 + 0 + 1
      = 13₁₀

2. 이진수 (Binary)

이진수의 특성

컴퓨터가 이진수를 사용하는 이유:

┌─────────────────────────────────────────────────────────┐
│              왜 컴퓨터는 이진수를 사용하는가?            │
├─────────────────────────────────────────────────────────┤
│  1. 전기 신호의 두 상태 (ON/OFF)와 대응                 │
│  2. 노이즈에 강함 (두 상태만 구분하면 됨)               │
│  3. 논리 연산과 직접 대응 (참/거짓)                     │
│  4. 회로 설계가 단순함                                  │
└─────────────────────────────────────────────────────────┘

     전압
       │
   5V ─┤  ████████           ████████
       │          │         │
   0V ─┤──────────┴─────────┴────────── 시간
       │
         HIGH(1)    LOW(0)   HIGH(1)

이진수 표기

이진수 표기 방법:
- 하위 첨자: 1010₂
- 접두사: 0b1010 (프로그래밍에서 많이 사용)
- 접미사: 1010b

2의 거듭제곱 (암기 권장):
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ 2⁰  │ 2¹  │ 2²  │ 2³  │ 2⁴  │ 2⁵  │ 2⁶  │ 2⁷  │ 2⁸  │
├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│  1  │  2  │  4  │  8  │ 16  │ 32  │ 64  │ 128 │ 256 │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

┌─────┬─────┬──────┬──────┬───────┐
│ 2⁹  │ 2¹⁰ │ 2¹¹  │ 2¹²  │ 2¹⁶   │
├─────┼─────┼──────┼──────┼───────┤
│ 512 │1024 │ 2048 │ 4096 │ 65536 │
└─────┴─────┴──────┴──────┴───────┘

이진수 덧셈

이진수 덧셈 규칙:
  0 + 0 = 0
  0 + 1 = 1
  1 + 0 = 1
  1 + 1 = 10 (0을 쓰고 1 올림)
  1 + 1 + 1 = 11 (1을 쓰고 1 올림)

예시: 1011 + 1101
        1 1     (올림)
        1 0 1 1
      + 1 1 0 1
      ─────────
      1 1 0 0 0

검증: 11₁₀ + 13₁₀ = 24₁₀ = 11000₂ ✓

이진수 뺄셈

이진수 뺄셈 규칙:
  0 - 0 = 0
  1 - 0 = 1
  1 - 1 = 0
  0 - 1 = 1 (상위 비트에서 빌림)

예시: 1101 - 1011
        0 10    (빌림)
        1 1 0 1
      - 1 0 1 1
      ─────────
        0 0 1 0

검증: 13₁₀ - 11₁₀ = 2₁₀ = 10₂ ✓

3. 8진수 (Octal)

8진수의 특성

8진수는 0~7까지의 숫자를 사용합니다.
2³ = 8이므로, 이진수 3자리가 8진수 1자리에 대응됩니다.

이진수와 8진수의 관계:
┌────────┬────────┐
 이진수  8진수  
├────────┼────────┤
  000      0    
  001      1    
  010      2    
  011      3    
  100      4    
  101      5    
  110      6    
  111      7    
└────────┴────────┘

8진수 표기

8진수 표기 방법:
- 하위 첨자: 753
- 접두사: 0o753 (Python) 또는 0753 (C)

예시: 이진수  8진수
110 101 011
 6   5   3 = 653

예시: 8진수  이진수
752 = 111 101 010

8진수의 용도

┌─────────────────────────────────────────────────────────┐
│                    8진수의 활용                          │
├─────────────────────────────────────────────────────────┤
│  1. Unix/Linux 파일 권한 (chmod 755)                    │
│     - 755 = rwxr-xr-x                                   │
│     - 7 = 111₂ = rwx (읽기+쓰기+실행)                   │
│     - 5 = 101₂ = r-x (읽기+실행)                        │
│                                                         │
│  2. 과거 컴퓨터 시스템 (PDP-8 등)                       │
│  3. 아스키 코드 표현                                    │
└─────────────────────────────────────────────────────────┘

4. 16진수 (Hexadecimal)

16진수의 특성

16진수는 0~9 A~F(10~15) 사용합니다.
2 = 16이므로, 이진수 4자리가 16진수 1자리에 대응됩니다.

이진수와 16진수의 관계:
┌────────┬────────┬────────┐
 10진수  이진수  16진수 
├────────┼────────┼────────┤
   0      0000     0    
   1      0001     1    
   2      0010     2    
   3      0011     3    
   4      0100     4    
   5      0101     5    
   6      0110     6    
   7      0111     7    
   8      1000     8    
   9      1001     9    
  10      1010     A    
  11      1011     B    
  12      1100     C    
  13      1101     D    
  14      1110     E    
  15      1111     F    
└────────┴────────┴────────┘

16진수 표기

16진수 표기 방법:
- 하위 첨자: 2AF₁₆
- 접두사: 0x2AF (가장 많이 사용)
- 접미사: 2AFh

예시: 이진수  16진수
1010 1111 0011
 A    F    3₁₆ = 0xAF3

예시: 16진수  이진수
0x3E8 = 0011 1110 1000

16진수의 용도

┌─────────────────────────────────────────────────────────┐
│                   16진수의 활용                          │
├─────────────────────────────────────────────────────────┤
│  1. 메모리 주소 표현                                    │
│     - 0x7FFE1234                                        │
│                                                         │
│  2. 색상 코드 (RGB)                                     │
│     - #FF5733 = Red(FF) Green(57) Blue(33)              │
│     - 각 색상은 0~255 (0x00~0xFF)                       │
│                                                         │
│  3. MAC 주소                                            │
│     - 00:1A:2B:3C:4D:5E                                 │
│                                                         │
│  4. 기계어/어셈블리 코드                                │
│     - MOV AX, 0x1234                                    │
│                                                         │
│  5. 유니코드/ASCII 코드                                 │
│     - 'A' = 0x41 = 65                                   │
└─────────────────────────────────────────────────────────┘

5. 진법 변환

5.1 10진수 → 2진수 변환

방법 1: 나눗셈 이용 (정수 부분)

10진수 25 2진수로 변환:

25 ÷ 2 = 12 ... 나머지 1  
12 ÷ 2 =  6 ... 나머지 0  
 6 ÷ 2 =  3 ... 나머지 0   아래에서 위로 읽기
 3 ÷ 2 =  1 ... 나머지 1  
 1 ÷ 2 =  0 ... 나머지 1  

결과: 25₁₀ = 11001

방법 2: 곱셈 이용 (소수 부분)

10진수 0.625 2진수로 변환:

0.625 × 2 = 1.25   정수부 1  
0.25  × 2 = 0.5    정수부 0  
0.5   × 2 = 1.0    정수부 1   위에서 아래로 읽기
0.0   (종료)                  

결과: 0.625₁₀ = 0.101

5.2 2진수 → 10진수 변환

이진수 110101을 10진수로 변환:

   1    1    0    1    0    1
  2⁵   2⁴   2³   2²   2¹   2⁰
  32   16    8    4    2    1

= 1×32 + 1×16 + 0×8 + 1×4 + 0×2 + 1×1
= 32 + 16 + 0 + 4 + 0 + 1
= 53₁₀

5.3 2진수 ↔ 16진수 변환

이진수 → 16진수: 4비트씩 묶어서 변환

  1011 1010 0110 1111₂
   B    A    6    F
= 0xBA6F

16진수 → 이진수: 각 자리를 4비트로 변환

0x2F5 = 0010 1111 0101₂
        2    F    5

5.4 10진수 ↔ 16진수 변환

10진수  16진수: 16으로 나누기

500 ÷ 16 = 31 ... 나머지 4   
 31 ÷ 16 =  1 ... 나머지 15 (F)  
  1 ÷ 16 =  0 ... 나머지 1   

500₁₀ = 0x1F4

16진수  10진수: 자릿값 계산

0x1F4 = 1×16² + 15×16¹ + 4×16
      = 256 + 240 + 4
      = 500₁₀

진법 변환 요약 다이어그램

           ┌──────────────────┐
           │     10진수       │
           └────────┬─────────┘
          ÷2       │        ÷16
      나머지 역순  │    나머지 역순
                   │
    ┌──────────────┼──────────────┐
    │              │              │
    ▼              │              ▼
┌───────┐          │         ┌────────┐
│ 2진수 │←─────────┼─────────→│ 16진수 │
└───────┘   4비트 묶기        └────────┘
            각 자리를
            4비트 확장

진법 변환 빠른 참조표

┌──────────┬──────────┬──────────┬──────────┐
│  10진수  │  2진수   │  8진수   │  16진수  │
├──────────┼──────────┼──────────┼──────────┤
│    0     │   0000   │    0     │    0     │
│    1     │   0001   │    1     │    1     │
│    2     │   0010   │    2     │    2     │
│    3     │   0011   │    3     │    3     │
│    4     │   0100   │    4     │    4     │
│    5     │   0101   │    5     │    5     │
│    6     │   0110   │    6     │    6     │
│    7     │   0111   │    7     │    7     │
│    8     │   1000   │   10     │    8     │
│    9     │   1001   │   11     │    9     │
│   10     │   1010   │   12     │    A     │
│   11     │   1011   │   13     │    B     │
│   12     │   1100   │   14     │    C     │
│   13     │   1101   │   15     │    D     │
│   14     │   1110   │   16     │    E     │
│   15     │   1111   │   17     │    F     │
│   16     │  10000   │   20     │   10     │
│   32     │ 100000   │   40     │   20     │
│   64     │ 1000000  │  100     │   40     │
│  128     │10000000  │  200     │   80     │
│  255     │11111111  │  377     │   FF     │
│  256     │100000000 │  400     │  100     │
└──────────┴──────────┴──────────┴──────────┘

6. 데이터 단위

기본 단위

┌─────────────────────────────────────────────────────────┐
│                    데이터 단위 계층                      │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  비트 (bit)                                             │
│    └── 0 또는 1, 정보의 최소 단위                       │
│                                                         │
│  니블 (nibble)                                          │
│    └── 4비트 = 16진수 한 자리                           │
│                                                         │
│  바이트 (byte)                                          │
│    └── 8비트 = 문자 하나 표현 가능                      │
│                                                         │
│  워드 (word)                                            │
│    └── CPU가 한 번에 처리하는 데이터 크기               │
│        (16비트, 32비트, 64비트 등)                      │
│                                                         │
└─────────────────────────────────────────────────────────┘

비트와 바이트

1 바이트 = 8 비트

┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
(MSB)                              (LSB)
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
  2    2    2    2    2³    2²    2¹    2
 128    64    32    16     8     4     2     1

MSB (Most Significant Bit): 가장 왼쪽 비트 (최상위 비트)
LSB (Least Significant Bit): 가장 오른쪽 비트 (최하위 비트)

1 바이트로 표현 가능한 :
- 부호 없는 정수: 0 ~ 255 (2 = 256가지)
- 부호 있는 정수: -128 ~ 127

워드 크기

┌──────────────────────────────────────────────────────────┐
│                   시스템별 워드 크기                      │
├────────────────┬──────────┬───────────────────────────────┤
│    시스템      │ 워드 크기│          표현 범위            │
├────────────────┼──────────┼───────────────────────────────┤
│  8비트 시스템  │  1바이트 │  0 ~ 255                      │
│  16비트 시스템 │  2바이트 │  0 ~ 65,535                   │
│  32비트 시스템 │  4바이트 │  0 ~ 4,294,967,295            │
│  64비트 시스템 │  8바이트 │  0 ~ 18,446,744,073,709,551,615│
└────────────────┴──────────┴───────────────────────────────┘

대용량 단위

┌────────────────────────────────────────────────────────────┐
│                    저장 용량 단위                           │
├────────────┬────────────────────┬──────────────────────────┤
│    단위    │    2진 접두어      │     10진 접두어          │
│            │   (IEC 표준)       │    (SI 표준)             │
├────────────┼────────────────────┼──────────────────────────┤
│  킬로 (K)  │ 1 KiB = 2¹⁰ = 1,024│ 1 KB = 10³ = 1,000      │
│  메가 (M)  │ 1 MiB = 2²⁰        │ 1 MB = 10⁶              │
│  기가 (G)  │ 1 GiB = 2³⁰        │ 1 GB = 10⁹              │
│  테라 (T)  │ 1 TiB = 2⁴⁰        │ 1 TB = 10¹²             │
│  페타 (P)  │ 1 PiB = 2⁵⁰        │ 1 PB = 10¹⁵             │
│  엑사 (E)  │ 1 EiB = 2⁶⁰        │ 1 EB = 10¹⁸             │
└────────────┴────────────────────┴──────────────────────────┘

실제 용량 차이 예시:
- 1 TB 하드디스크 (10진): 1,000,000,000,000 바이트
- 운영체제 표시 (2진): 약 931 GiB

계산: 1,000,000,000,000 ÷ 1,073,741,824 ≈ 931 GiB

7. 보수의 개념

보수(Complement)란?

보수는 어떤 수를 특정 기준에서 뺀 값입니다.
컴퓨터에서 보수는 뺄셈을 덧셈으로 변환하는 데 사용됩니다.

┌─────────────────────────────────────────────────────────┐
│                     보수의 종류                          │
├─────────────────────────────────────────────────────────┤
│  r-1의 보수: 각 자릿수를 (r-1)에서 뺀 값                │
│  r의 보수: (r-1의 보수) + 1                             │
│                                                         │
│  이진수에서:                                            │
│  - 1의 보수: 각 비트를 반전 (0↔1)                       │
│  - 2의 보수: 1의 보수 + 1                               │
└─────────────────────────────────────────────────────────┘

1의 보수 (One's Complement)

1 보수: 모든 비트를 반전 (01, 10)

예시: 8비트에서 00101101 1 보수

  원래 :    0 0 1 0 1 1 0 1
                       
  1 보수:   1 1 0 1 0 0 1 0

검증: 45₁₀  1 보수  210₁₀
      45 + 210 = 255 = 2 - 1 

2의 보수 (Two's Complement)

2 보수: 1 보수 + 1 (또는 가장 오른쪽 1부터 왼쪽은 반전)

예시: 8비트에서 00101101 2 보수

방법 1: 1 보수 + 1
  원래 :    0 0 1 0 1 1 0 1  (45)
  1 보수:   1 1 0 1 0 0 1 0  (210)
           +                 1
  ─────────────────────────────
  2 보수:   1 1 0 1 0 0 1 1  (211)

방법 2: 오른쪽에서  번째 1까지 유지, 나머지 반전
  원래 :    0 0 1 0 1 1 0 1
                      
              여기까지 유지, 왼쪽은 반전
  2 보수:   1 1 0 1 0 0 1 1

검증: 45 + 211 = 256 = 2 

2의 보수의 중요성

┌─────────────────────────────────────────────────────────┐
│              2의 보수가 중요한 이유                      │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  1. 0의 표현이 유일함                                   │
│     - 1의 보수: +0 (00000000), -0 (11111111)            │
│     - 2의 보수: 0 (00000000) 하나뿐                     │
│                                                         │
│  2. 뺄셈을 덧셈으로 변환                                │
│     A - B = A + (-B) = A + (B의 2의 보수)               │
│                                                         │
│  3. 덧셈기 하나로 덧셈/뺄셈 모두 처리                   │
│                                                         │
│  4. 오버플로우 검출이 용이                              │
│                                                         │
└─────────────────────────────────────────────────────────┘

2의 보수를 이용한 뺄셈

예시: 7 - 3  8비트 2 보수로 계산

  7 = 00000111
  3 = 00000011

  3 2 보수 = 11111101 (= -3)

    0 0 0 0 0 1 1 1   (7)
  + 1 1 1 1 1 1 0 1   (-3, 3 2 보수)
  ─────────────────────
  1 0 0 0 0 0 1 0 0
  
  캐리 무시 (8비트이므로)

  결과: 00000100 = 4 

부호 있는 정수의 범위

n비트 2의 보수 표현 범위: -2^(n-1) ~ 2^(n-1) - 1

┌───────────┬──────────────────────────────────────────────┐
│  비트 수  │               표현 범위                       │
├───────────┼──────────────────────────────────────────────┤
│  4비트    │  -8 ~ 7                                      │
│  8비트    │  -128 ~ 127                                  │
│  16비트   │  -32,768 ~ 32,767                            │
│  32비트   │  -2,147,483,648 ~ 2,147,483,647              │
│  64비트   │  약 -9.2×10¹⁸ ~ 9.2×10¹⁸                     │
└───────────┴──────────────────────────────────────────────┘

8비트 2의 보수 숫자 원:

         0 (00000000)
          ↑
    -1 (11111111)  1 (00000001)
         ↖        ↗
          ·      ·
           ·    ·
    -128    ·  ·     127
  (10000000)  (01111111)

8. 연습 문제

기초 문제

1. 다음 10진수를 2진수로 변환하시오. - (a) 42 - (b) 100 - (c) 255

2. 다음 2진수를 10진수로 변환하시오. - (a) 10110 - (b) 11111111 - (c) 10000000

3. 다음 2진수를 16진수로 변환하시오. - (a) 11011010 - (b) 101111110000 - (c) 11111111111111111111111111111111

4. 다음 16진수를 2진수로 변환하시오. - (a) 0xAB - (b) 0x1234 - (c) 0xDEADBEEF

계산 문제

5. 다음 이진수 덧셈을 수행하시오. - (a) 1011 + 1101 - (b) 11111111 + 00000001 - (c) 10101010 + 01010101

6. 8비트 2의 보수 표현에서: - (a) -45의 이진 표현은? - (b) 11101100의 10진수 값은? - (c) 7 - 12의 결과는?

7. 다음 10진 소수를 이진수로 변환하시오 (소수점 이하 4자리까지). - (a) 0.5 - (b) 0.25 - (c) 0.1

심화 문제

8. 1 GiB와 1 GB의 차이는 몇 바이트인가?

9. 32비트 시스템에서 메모리 주소 지정이 최대 4GB로 제한되는 이유를 설명하시오.

10. 다음 상황을 분석하시오:

signed char a = 127;
a = a + 1;
// a의 값은?

정답 **1. 10진수 → 2진수** - (a) 42 = 101010 - (b) 100 = 1100100 - (c) 255 = 11111111 **2. 2진수 → 10진수** - (a) 10110 = 22 - (b) 11111111 = 255 - (c) 10000000 = 128 **3. 2진수 → 16진수** - (a) 11011010 = 0xDA - (b) 101111110000 = 0xBF0 - (c) 11111111111111111111111111111111 = 0xFFFFFFFF **4. 16진수 → 2진수** - (a) 0xAB = 10101011 - (b) 0x1234 = 0001001000110100 - (c) 0xDEADBEEF = 11011110101011011011111011101111 **5. 이진수 덧셈** - (a) 1011 + 1101 = 11000 (11 + 13 = 24) - (b) 11111111 + 00000001 = 100000000 (오버플로우 발생 시 결과에 따라 다름) - (c) 10101010 + 01010101 = 11111111 (170 + 85 = 255) **6. 2의 보수** - (a) -45 = 11010011 (45 = 00101101, 보수 = 11010011) - (b) 11101100 = -20 (MSB가 1이므로 음수, 보수 = 00010100 = 20) - (c) 7 - 12 = -5 = 11111011 **7. 10진 소수 → 이진수** - (a) 0.5 = 0.1 - (b) 0.25 = 0.01 - (c) 0.1 ≈ 0.0001 (정확히는 0.0001100110011... 무한 반복) **8.** - 1 GiB = 1,073,741,824 바이트 - 1 GB = 1,000,000,000 바이트 - 차이 = 73,741,824 바이트 ≈ 70.3 MiB **9.** 32비트 시스템은 32비트 주소를 사용하므로 2³² = 4,294,967,296개의 주소를 지정할 수 있습니다. 각 주소가 1바이트를 가리키므로 최대 4GB(약 4GiB)의 메모리만 직접 접근할 수 있습니다. **10.** a = -128. signed char의 범위는 -128~127이므로, 127+1은 오버플로우가 발생하여 -128이 됩니다. 이는 2의 보수 표현에서 01111111(127) + 1 = 10000000(-128)이기 때문입니다.

다음 단계


참고 자료

to navigate between lessons