ROONTAMS
ROONTAMS
ROONTAMS
전체 방문자
오늘
어제
  • 분류 전체보기 (13)
    • Unity : 개발 (0)
    • 강의 (12)
      • iOS개발 강의 (6)
      • React 강의 (1)
      • 컴퓨터 구조 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ROONTAMS

ROONTAMS

강의/컴퓨터 구조

데이터의 표현 - Part1

2025. 9. 19. 03:15
컴퓨터구조 - 3주차: 데이터 표현 I

컴퓨터구조

3주차: 데이터 표현 Part I
컴퓨터에서 사용하는 수 • 진법 • 정수의 표현
🎯 학습 목표
• 컴퓨터가 0과 1만으로 모든 정보를 표현하는 원리를 이해한다.
• 다양한 진법 간 변환을 자유롭게 수행할 수 있다.
• 정수가 메모리에 저장되는 방식과 2의 보수를 완벽히 이해한다.
• 소프트웨어 개발 시 발생할 수 있는 데이터 표현 관련 문제를 예측하고 해결할 수 있다.

들어가며: 왜 2진수를 배워야 하는가?

많은 학생들이 묻는다. "고수준 프로그래밍 언어를 사용하는데 왜 2진수를 알아야 하나요?" 이 질문에 대한 답은 간단하다. 컴퓨터는 여전히 0과 1로만 동작하기 때문이다.

💻 소프트웨어 개발자가 2진수를 알아야 하는 실제 이유

1. 디버깅 능력 향상: 정수 오버플로우, 부동소수점 오차 등의 버그는 2진 표현을 이해해야만 근본 원인을 파악할 수 있다.
2. 최적화: 비트 연산은 일반 연산보다 훨씬 빠르다. 2의 거듭제곱으로 나누기는 오른쪽 시프트로, 곱하기는 왼쪽 시프트로 대체할 수 있다.
3. 메모리 효율: 비트 플래그를 사용하면 32개의 불린 값을 4바이트에 저장할 수 있다.
4. 네트워크 프로그래밍: IP 주소, 서브넷 마스크 계산은 2진수 이해가 필수다.
5. 보안: 암호화, 해시 함수는 비트 단위 연산을 기반으로 한다.

⚠️ 실제 사고 사례
1996년 유럽 우주국의 아리안 5호 로켓이 발사 37초 만에 폭발했다. 원인은 64비트 부동소수점 값을 16비트 정수로 변환하는 과정에서 발생한 오버플로우였다. 이 사고로 3억 7천만 달러의 손실이 발생했다. 데이터 표현의 이해가 얼마나 중요한지 보여주는 대표적 사례다.

1.1 컴퓨터에서 사용하는 수

1.1.1 비트와 디지털 세계

컴퓨터는 전기 신호로 동작한다. 전기는 있거나(ON) 없거나(OFF) 두 가지 상태만 존재한다. 이 두 상태를 숫자로 표현한 것이 비트(bit, binary digit)다.

0
→ OFF (0V)
1
→ ON (5V)

아날로그 vs 디지털: 근본적 차이

아날로그 신호는 연속적이다. 온도계의 수은 높이처럼 3.1도, 3.14도, 3.141도... 무한히 세밀한 값을 가질 수 있다. 반면 디지털 신호는 이산적이다. 0 아니면 1, 중간값은 존재하지 않는다.

이런 디지털의 단순함이 오히려 장점이 된다. 노이즈에 강하고, 복제해도 품질이 떨어지지 않으며, 오류 검출과 수정이 가능하다. MP3 파일을 100번 복사해도 음질이 변하지 않는 이유다.

비트에서 바이트로

단위 비트 수 표현 가능한 경우의 수 실제 용도
비트 (bit) 1 2 (0, 1) 참/거짓, ON/OFF
니블 (nibble) 4 16 (0~15) 16진수 한 자리
바이트 (byte) 8 256 (0~255) ASCII 문자 하나
워드 (word) 16/32/64 시스템 의존 CPU가 한 번에 처리하는 단위
💡 왜 바이트는 8비트일까?
초기에는 6비트, 7비트 바이트도 있었다. 하지만 8비트가 표준이 된 이유는:
• 2의 3제곱으로 하드웨어 설계가 깔끔하다
• ASCII 코드(7비트) + 패리티 비트(1비트)를 담기 적합하다
• 256개 값은 문자를 표현하기에 충분하면서도 과하지 않다

메모리 단위의 실제 크기

컴퓨터 과학에서는 2의 거듭제곱을 자주 사용한다. 하지만 하드디스크 제조사는 10의 거듭제곱을 사용한다. 이 차이 때문에 1TB 하드디스크를 구매해도 컴퓨터에서는 931GB로 표시되는 것이다.

단위 이진 접두어 (실제) 십진 접두어 (마케팅) 차이
킬로 (K) 1,024 = 2¹⁰ 1,000 = 10³ 2.4%
메가 (M) 1,048,576 = 2²⁰ 1,000,000 = 10⁶ 4.9%
기가 (G) 1,073,741,824 = 2³⁰ 1,000,000,000 = 10⁹ 7.4%
테라 (T) 1,099,511,627,776 = 2⁴⁰ 1,000,000,000,000 = 10¹² 10%

📝 노트 연습 1.1

  1. 1MB는 몇 비트인가? (이진 접두어 기준)
  2. 32GB USB의 실제 바이트 수를 계산하라. (이진 접두어 기준)
  3. 왜 프로그래머는 1024를 좋아하는가? 2의 몇 제곱인지 구하라.

1.1.2 왜 컴퓨터는 2진수를 사용하는가?

컴퓨터가 10진수를 사용하면 안 될까? 실제로 초기에는 10진 컴퓨터를 만들려는 시도가 있었다. 하지만 2진수가 선택된 데는 명확한 공학적 이유가 있다.

1. 노이즈 내성과 신뢰성

예시: 전압 레벨로 숫자 표현하기

10진수 시스템 (10개 전압 레벨)
0V=0, 0.5V=1, 1.0V=2, ... 4.5V=9
→ 문제: 0.48V는 1일까? 0일까? 노이즈로 0.52V가 되면?

2진수 시스템 (2개 전압 레벨)
0~2V = 0, 3~5V = 1
→ 장점: 1V의 노이즈가 있어도 정확히 구분 가능!

2. 회로 설계의 단순성

트랜지스터는 스위치다. ON 아니면 OFF, 두 가지 상태만 있다. 이런 트랜지스터로 10가지 상태를 만들려면 회로가 복잡해진다. 반면 2진수는 트랜지스터 하나가 비트 하나에 대응되어 설계가 단순하다.

3. 부울 대수와의 완벽한 대응

조지 부울이 만든 부울 대수는 참(True)과 거짓(False) 두 값만으로 논리를 전개한다. 이는 2진수의 1과 0에 완벽히 대응된다.

논리 연산 부울 대수 2진수 연산 회로 구현
AND True ∧ True = True 1 × 1 = 1 직렬 스위치
OR True ∨ False = True 1 + 0 = 1 병렬 스위치
NOT ¬True = False NOT 1 = 0 인버터

💻 프로그래머를 위한 통찰

프로그래밍의 if문, while문 등 모든 제어 구조는 결국 참/거짓 판단이다. 이것이 CPU 레벨에서는 비트의 0/1 비교로 구현된다. 따라서 조건문을 작성할 때 "이것이 결국 0인지 아닌지 판단하는 것"임을 이해하면, 더 효율적인 코드를 작성할 수 있다.

// 비효율적인 코드
if (x == 0) { ... }  // 비교 연산 필요

// 효율적인 코드
if (!x) { ... }      // 0인지 직접 확인

📝 노트 연습 1.2

  1. 10진수 0부터 15까지를 4비트 2진수로 표현하라.
  2. 8비트로 표현 가능한 서로 다른 값의 개수는?
  3. n비트로 표현 가능한 최대값의 공식을 유도하라.

1.2 진법

1.2.1 진법의 기초

진법(numeral system)은 수를 표현하는 방법이다. 우리가 일상에서 사용하는 10진법은 0부터 9까지 10개의 기호를 사용한다. 컴퓨터는 0과 1, 두 개의 기호만 사용하는 2진법을 쓴다.

위치 표기법 (Positional Notation)

현대 진법 체계는 위치 표기법을 사용한다. 같은 숫자라도 위치에 따라 값이 달라진다. 예를 들어 345에서 3은 300을, 4는 40을, 5는 5를 의미한다.

345₁₀ = 3×10² + 4×10¹ + 5×10⁰ = 300 + 40 + 5

컴퓨터에서 사용하는 4가지 진법

2진법 (Binary)

기호: 0, 1
용도: CPU 내부 연산
예: 1011₂ = 11₁₀

8진법 (Octal)

기호: 0~7
용도: Unix 파일 권한
예: 755₈ = rwxr-xr-x

10진법 (Decimal)

기호: 0~9
용도: 일상 계산
예: 255₁₀

16진법 (Hexadecimal)

기호: 0~9, A~F
용도: 메모리 주소, 색상
예: 0xFF = 255₁₀

💡 왜 16진법을 사용하는가?
• 2진수 4자리가 16진수 1자리에 정확히 대응된다 (2⁴ = 16)
• 11111111₂ 보다 FF₁₆가 읽기 쉽다
• 메모리 주소 0x7FFF3A20처럼 간결하게 표현 가능하다
• RGB 색상 #FF0000 (빨강) 같은 표현이 직관적이다

1.2.2 진법 변환 완벽 마스터

10진수 → 2진수 변환

두 가지 방법이 있다. 나눗셈법과 뺄셈법이다.

방법 1: 나눗셈법 (가장 일반적)

156을 2진수로 변환하기:

156 ÷ 2 = 78 ... 0  ↑
 78 ÷ 2 = 39 ... 0  │
 39 ÷ 2 = 19 ... 1  │ 아래에서 위로 읽기
 19 ÷ 2 =  9 ... 1  │
  9 ÷ 2 =  4 ... 1  │
  4 ÷ 2 =  2 ... 0  │
  2 ÷ 2 =  1 ... 0  │
  1 ÷ 2 =  0 ... 1  │

결과: 156₁₀ = 10011100₂
            

방법 2: 뺄셈법 (큰 수에 유용)

156에서 2의 거듭제곱을 빼기:

156 - 128 (2⁷) = 28  → 1
 28 -  64 (2⁶) = 불가 → 0
 28 -  32 (2⁵) = 불가 → 0
 28 -  16 (2⁴) = 12  → 1
 12 -   8 (2³) = 4   → 1
  4 -   4 (2²) = 0   → 1
  0 -   2 (2¹) = 불가 → 0
  0 -   1 (2⁰) = 불가 → 0

결과: 156₁₀ = 10011100₂
            

2진수 → 10진수 변환

가중치법을 사용한다. 각 자리의 값에 해당 자리의 가중치(2의 거듭제곱)를 곱해서 더한다.

예시: 10011100₂를 10진수로

1×2⁷ + 0×2⁶ + 0×2⁵ + 1×2⁴ + 1×2³ + 1×2² + 0×2¹ + 0×2⁰
= 128 + 0 + 0 + 16 + 8 + 4 + 0 + 0
= 156₁₀
            

2진수 ↔ 8진수/16진수 빠른 변환

2진수를 3비트(8진수) 또는 4비트(16진수)씩 묶으면 빠르게 변환할 수 있다. 이것이 8진수와 16진수를 사용하는 진짜 이유다.

2진수 → 16진수

10011100₂를 4비트씩 묶기:
1001 | 1100
  9  |  C
  
결과: 9C₁₆
            

2진수 → 8진수

10011100₂를 3비트씩 묶기:
010 | 011 | 100  (앞에 0 추가)
 2  |  3  |  4
  
결과: 234₈
            

소수점이 있는 경우

정수부와 소수부를 분리해서 변환한다. 소수부는 2를 곱하는 방식을 사용한다.

예시: 12.375₁₀를 2진수로

정수부 (12):
12 ÷ 2 = 6 ... 0
 6 ÷ 2 = 3 ... 0
 3 ÷ 2 = 1 ... 1
 1 ÷ 2 = 0 ... 1
정수부: 1100₂

소수부 (0.375):
0.375 × 2 = 0.75 → 0
0.75  × 2 = 1.5  → 1
0.5   × 2 = 1.0  → 1
소수부: .011₂

결과: 12.375₁₀ = 1100.011₂
            
⚠️ 주의: 순환소수
0.1₁₀을 2진수로 변환하면 0.00011001100110011...₂로 무한히 반복된다. 이것이 컴퓨터에서 0.1 + 0.2 ≠ 0.3인 근본 원인이다. 10진수로 정확히 표현되는 수가 2진수로는 무한소수가 될 수 있다!

📝 노트 연습 1.3

  1. 156.375₁₀을 2진수, 8진수, 16진수로 변환하라.
  2. 1011011.101₂를 10진수로 변환하라.
  3. RGB(255, 128, 64)를 16진수 색상 코드로 표현하라.
  4. 0xCAFE를 10진수와 2진수로 변환하라.
  5. Unix 파일 권한 755₈를 2진수로 표현하고 의미를 해석하라.

1.2.3 2진 연산

2진수 덧셈

2진수 덧셈은 10진수와 같은 원리다. 다만 1 + 1 = 10₂ (2가 되면 자리 올림)임을 기억하라.

예시: 1101₂ + 1011₂

    1 1 0 1  (13₁₀)
  + 1 0 1 1  (11₁₀)
  ---------
  1 1 0 0 0  (24₁₀)
  ↑ ↑ ↑
  캐리 발생
            

2진수 뺄셈

뺄셈도 10진수와 같다. 0 - 1이 되면 옆 자리에서 빌려온다(borrow).

예시: 1100₂ - 0101₂

    1 1 0 0  (12₁₀)
  - 0 1 0 1  ( 5₁₀)
  ---------
    0 1 1 1  ( 7₁₀)
            

비트 시프트 연산: 프로그래머의 비밀 무기

왼쪽 시프트는 2배, 오른쪽 시프트는 2로 나누기와 같다. 이는 일반 곱셈/나눗셈보다 훨씬 빠르다.

// C 언어 예제
int x = 5;        // 0101₂
x = x << 1;      // 1010₂ = 10₁₀ (2배)
x = x >> 1;      // 0101₂ = 5₁₀ (2로 나누기)

// 최적화 예시
int slow = x * 32;     // 느린 곱셈
int fast = x << 5;     // 빠른 시프트 (2⁵ = 32)

💻 컴파일러 최적화의 비밀

현대 컴파일러는 2의 거듭제곱 곱셈/나눗셈을 자동으로 시프트 연산으로 변환한다. 하지만 음수 나눗셈은 조심해야 한다. -1 >> 1은 -1이 되는데(부호 비트 유지), 이는 -1 / 2 = 0과 다르다. 이런 미묘한 차이를 이해하는 것이 전문 프로그래머의 역량이다.

1.3 정수의 표현

1.3.1 부호 없는 정수 (Unsigned Integer)

부호 없는 정수는 음수가 없다. n비트로 0부터 2ⁿ-1까지 표현할 수 있다. 예를 들어 8비트 unsigned char는 0~255를 표현한다.

비트 수 표현 범위 C 타입 (일반적) 용도
8 0 ~ 255 unsigned char 픽셀 값, 작은 카운터
16 0 ~ 65,535 unsigned short 포트 번호, UTF-16
32 0 ~ 4,294,967,295 unsigned int 메모리 주소(32비트), 색상
64 0 ~ 18,446,744,073,709,551,615 unsigned long long 파일 크기, 고유 ID

오버플로우와 언더플로우

unsigned 정수는 최대값을 넘으면 0으로 돌아간다(오버플로우). 0에서 1을 빼면 최대값이 된다(언더플로우).

8비트 unsigned에서의 오버플로우

  11111111₂  (255)
+ 00000001₂  (  1)
-----------
 100000000₂  (256이지만 8비트를 넘어서 버려짐)
  00000000₂  (결과는 0)
            
⚠️ 실제 버그 사례
unsigned int size = 10;
for (unsigned int i = size; i >= 0; i--) {
    // 무한 루프! i는 unsigned라 0보다 작아질 수 없다
}
unsigned는 음수가 될 수 없으므로 i >= 0은 항상 참이다!

1.3.2 부호 있는 정수 표현법 비교

음수를 표현하는 방법은 역사적으로 세 가지가 시도되었다. 각각의 장단점을 이해하면 왜 현대 컴퓨터가 2의 보수를 선택했는지 알 수 있다.

방법 1: 부호-크기 표현 (Sign-Magnitude)

가장 직관적인 방법이다. 최상위 비트(MSB)를 부호 비트로 사용한다. 0이면 양수, 1이면 음수다.

4비트 부호-크기 표현

2진수 10진수 문제점
0111 +7
0001 +1
0000 +0 0이 두 개!
1000 -0
1001 -1
1111 -7

문제점:
• +0과 -0이 따로 존재한다
• 덧셈 회로가 복잡해진다 (부호를 먼저 확인해야 함)
• 비교 연산도 복잡하다

방법 2: 1의 보수 (One's Complement)

음수는 양수의 모든 비트를 반전시켜 만든다. NOT 게이트만 있으면 되므로 하드웨어가 간단하다.

4비트 1의 보수 표현

+3 = 0011₂
-3 = 1100₂ (비트 반전)

+5 = 0101₂
-5 = 1010₂ (비트 반전)
            

문제점:
• 여전히 +0(0000)과 -0(1111)이 존재한다
• 덧셈 후 순환 캐리(end-around carry) 처리가 필요하다

방법 3: 2의 보수 (Two's Complement) ⭐

음수는 양수의 비트를 반전시킨 후 1을 더해 만든다. 이 방법이 현대 컴퓨터의 표준이 되었다.

2의 보수 구하기

+5를 -5로 변환:
 0101₂ (+5)
↓ 비트 반전
 1010₂
↓ 1 더하기
 1011₂ (-5)

검증: 5 + (-5) = 0인가?
  0101₂
+ 1011₂
-------
 10000₂ → 4비트 넘어서 버려짐 → 0000₂ ✓
            

4비트 2의 보수 완전 표

2진수 10진수 특징
0111 +7 최대 양수
0110 +6
0101 +5
0100 +4
0011 +3
0010 +2
0001 +1
0000 0 유일한 0
1111 -1
1110 -2
1101 -3
1100 -4
1011 -5
1010 -6
1001 -7
1000 -8 최소 음수 (절댓값이 가장 큼)
💡 2의 보수의 비대칭성
n비트 2의 보수는 -2ⁿ⁻¹부터 2ⁿ⁻¹-1까지 표현한다. 음수가 양수보다 하나 더 많다! 예를 들어 8비트는 -128~127을 표현한다. 이것이 int의 최소값에 -1을 곱하면 오버플로우가 발생하는 이유다.

📝 노트 연습 1.4

  1. 8비트 unsigned에서 255 + 3의 결과를 계산하라.
  2. -35를 8비트 2의 보수로 표현하라.
  3. 8비트 2진수 10110011₂의 10진수 값을 구하라. (2의 보수로 해석)
  4. 4비트 1101을 8비트로 부호 확장하라.
  5. 왜 2의 보수에서 최소 음수의 절댓값이 최대 양수보다 1 큰가?

1.3.3 2의 보수 심화

왜 2의 보수가 최고인가?

2의 보수가 컴퓨터 표준이 된 결정적 이유는 덧셈 회로만으로 뺄셈을 할 수 있기 때문이다.

뺄셈을 덧셈으로: 7 - 3 = 7 + (-3)

7 - 3을 계산하려면:
1. 3의 2의 보수를 구한다: 0011 → 1100 → 1101 (-3)
2. 7과 더한다:
   0111 (+7)
 + 1101 (-3)
 -------
  10100
  └→ 5번째 비트는 버림
   0100 (+4) ✓
            

이는 하드웨어 설계를 극도로 단순화한다. 별도의 뺄셈 회로가 필요 없고, ALU에서 SUB 명령이 오면 단지 피연산자의 2의 보수를 구해서 ADD 회로에 넘기면 된다.

음수 판별: MSB의 마법

2의 보수에서 최상위 비트(MSB)는 부호 비트 역할을 한다. 0이면 양수(또는 0), 1이면 음수다. 이는 우연이 아니라 수학적 필연이다.

💻 비트 연산으로 부호 확인하기

int x = -42;
if (x & (1 << 31)) {  // 32비트 int의 MSB 확인
    printf("음수입니다\n");
}

// 더 간단하게
if (x < 0) {  // 컴파일러가 MSB 확인으로 변환
    printf("음수입니다\n");
}

부호 확장 (Sign Extension)

작은 크기의 정수를 큰 크기로 변환할 때, 값을 유지하려면 부호 비트를 확장해야 한다.

4비트를 8비트로 확장

양수: 0101 (5) → 00000101 (5)  MSB가 0이므로 0으로 채움
음수: 1011 (-5) → 11111011 (-5) MSB가 1이므로 1로 채움

잘못된 확장:
1011 (-5) → 00001011 (11) ✗ 값이 바뀜!
            

정수 오버플로우: 보이지 않는 폭탄

2의 보수 정수는 표현 범위를 넘으면 반대 부호로 바뀐다. 이는 수많은 보안 취약점과 시스템 오류의 원인이 된다.

8비트 signed char 오버플로우

 01111111 (127) 
+00000001 (+1)
----------
 10000000 (-128) ← 갑자기 음수!
            
⚠️ 역사적 사고 사례 1: 아리안 5호 (1996)

64비트 부동소수점 수평 속도 값을 16비트 정수로 변환하는 과정에서 오버플로우 발생. 로켓이 코스를 벗어나 자폭. 손실액: 3억 7천만 달러.

// 문제가 된 코드 (Ada 언어 의사코드)
float64 horizontal_velocity = 32768.5;  // 정상 범위
int16 converted = (int16)horizontal_velocity;  
// 16비트 signed: -32768 ~ 32767
// 32768은 범위 초과 → 오버플로우!
⚠️ 역사적 사고 사례 2: 간디의 공격성 (Civilization, 1991)

게임 문명(Civilization)에서 간디의 공격성은 1 (최저)로 설정되었다. 민주주의를 채택하면 공격성이 2 감소하는데, 1 - 2 = -1이 되어야 하지만 unsigned로 저장되어 255 (최대 공격성)가 되었다. 평화주의자 간디가 핵무기를 난사하는 버그가 되었다.

unsigned char gandhi_aggression = 1;
gandhi_aggression -= 2;  // 언더플로우!
// 결과: 255 (0xFF)

// 올바른 수정
if (gandhi_aggression >= 2) {
    gandhi_aggression -= 2;
} else {
    gandhi_aggression = 0;
}
💡 오버플로우 방지 기법
1. 범위 검사: 연산 전에 오버플로우 가능성을 확인
2. 큰 타입 사용: int 대신 long long 사용
3. 컴파일러 경고: -ftrapv (GCC) 옵션으로 오버플로우 감지
4. 안전한 라이브러리: SafeInt (C++), checked arithmetic (Rust)
5. 부호 없는 정수 주의: 뺄셈이 있다면 signed 사용 고려

마무리: Part 1 핵심 정리

🔑 반드시 기억해야 할 핵심 개념

1. 비트와 디지털
• 컴퓨터는 0과 1로만 동작한다 - 이것은 선택이 아닌 필연이다
• 노이즈 내성, 회로 단순성, 부울 대수와의 대응이 2진수 선택 이유다

2. 진법 변환
• 2진수 ↔ 16진수 변환은 4비트 묶음으로 빠르게 할 수 있다
• 10진수 0.1은 2진수로 순환소수가 된다 (부동소수점 오차의 원인)

3. 2의 보수
• 현대 컴퓨터는 2의 보수로 음수를 표현한다
• 덧셈 회로만으로 뺄셈이 가능하다는 것이 핵심 장점이다
• n비트는 -2ⁿ⁻¹ ~ 2ⁿ⁻¹-1을 표현한다 (비대칭!)

4. 오버플로우
• 정수 오버플로우는 심각한 버그와 보안 취약점의 원인이다
• 특히 unsigned에서 signed로, 큰 타입에서 작은 타입으로 변환 시 주의하라

💻 소프트웨어 엔지니어로서의 다음 단계

이제 당신은 컴퓨터가 숫자를 표현하는 방식을 이해했다. 이 지식은 다음과 같은 상황에서 빛을 발할 것이다:

  • 디버깅: "왜 이 값이 갑자기 음수가 되었지?"라는 질문에 답할 수 있다
  • 최적화: 비트 연산으로 코드 속도를 10배 향상시킬 수 있다
  • 시스템 프로그래밍: 메모리 주소, 포인터 연산을 자신 있게 다룰 수 있다
  • 보안: 정수 오버플로우 취약점을 사전에 방지할 수 있다
  • 임베디드: 제한된 메모리에서 효율적인 데이터 구조를 설계할 수 있다

📝 Part 1 종합 연습 문제

  1. RGB(128, 255, 64)를 하나의 32비트 정수로 저장하는 방법을 설계하라.
  2. 체스판의 상태를 비트로 표현하는 방법을 제안하라. (힌트: 64칸)
  3. -128의 8비트 2의 보수에 -1을 곱하면 어떻게 되는가? 왜?
  4. float가 0.1을 정확히 표현할 수 없는 이유를 2진수로 설명하라.
  5. 왜 메모리 주소는 16진수로 표현하는가? 10진수보다 나은 점은?

다음 Part 2에서는...

실수의 표현 (IEEE 754), 문자 인코딩,
그리고 부동소수점 연산의 함정에 대해 다룹니다.

'강의 > 컴퓨터 구조' 카테고리의 다른 글

데이터의 표현 - Part2  (0) 2025.09.19
컴퓨터 구조 개론 - Part 3  (1) 2025.09.12
컴퓨터 구조 개론 - Part 2  (0) 2025.09.12
컴퓨터 구조 개론 - Part 1  (0) 2025.09.12
    '강의/컴퓨터 구조' 카테고리의 다른 글
    • 데이터의 표현 - Part2
    • 컴퓨터 구조 개론 - Part 3
    • 컴퓨터 구조 개론 - Part 2
    • 컴퓨터 구조 개론 - Part 1
    ROONTAMS
    ROONTAMS

    티스토리툴바