I. 자료와 자료 구조

4. 보수(1의 보수, 2의 보수)와 문자 인코딩 · 약 5분

← 전체 목차 이 단원 목차

🎮 이 단원이 게임에서 쓰이는 곳 (언더테일·RPG)

보수·부호 비트 = 게임에서 데미지 -5, 골드 감소처럼 음수를 저장할 때 2의 보수로 저장해요. "n비트로 표현 가능한 범위"는 부호 있으면 -2^(n-1)~2^(n-1)-1, 부호 없으면 0~2^n-1이라서 HP·스탯 최대값 설계할 때 쓰입니다. 인코딩은 대사·아이템 이름 같은 문자열을 파일에 저장할 때 UTF-8 등으로 쓰여요.

부호 비트 — 먼저 이걸 구분하자

교과서에서 "부호 있는 수", "부호 없는 수"라고 나오면 맨 앞 비트 한 칸을 뭘로 쓰느냐만 구분하면 돼요.

비트 한 줄이 있을 때, 맨 왼쪽 한 칸을 "양수/음수 표시"로 쓰면 부호 있는 수, 그 칸까지 그냥 "숫자 크기"로만 쓰면 부호 없는 수예요.

4비트 예시 (맨 앞 = 부호 비트라고 생각할 때)

[맨 앞 1칸] [나머지 3칸]
    부호       크기
    0 = 양수   000~111  →  양수 0~7
    1 = 음수   (2의 보수로 해석) →  음수 -8~-1

정리하면, 부호 비트 = "맨 앞 한 비트가 부호(+,−)를 나타낸다"고 정해 둔 것이에요. "부호 있는 수"일 때만 그 비트를 부호로 쓰고, "부호 없는 수"일 때는 그 비트도 그냥 크기로만 써서 헷갈리지 말면 돼요.

프로그래밍 기능사에서: 보수 문제에 "부호 비트(사인 비트)"가 나오는지 판단하는 기준

보수 변환 문제를 풀 때, 부호 비트를 언급해야 하는지는 아래처럼 보면 돼요.

한 줄 요약: 문제에 음수, 부호 있는/signed, 범위(음수 포함), 최상위 비트·MSB·부호 비트·사인 비트 중 하나라도 나오면 → "맨 앞 한 비트 = 부호 비트"로 보고 풀면 돼요.

보수(補數) — 시험 단골

컴퓨터에서 음수를 표현하거나 뺄셈을 할 때 "보수"를 씁니다. 어떤 수에 더했을 때 자릿수가 한 단계 올라가게 만드는 수예요. 부호 있는 수에서 음수는 보통 2의 보수로 저장해요.

1의 보수

2진수에서 0은 1로, 1은 0으로 바꾼 거예요. "비트 반전"이라고 해요.

예: 0011 (3)의 1의 보수 → 1100. 0011 + 1100 = 1111 (4비트에서 모두 1)

2의 보수

1의 보수에 1을 더한 값이에요. 컴퓨터는 보통 2의 보수로 음수를 표현해요.

예: 0011 (3)의 2의 보수 → 1100 + 1 = 1101. 이 1101을 "-3"으로 씁니다. 0011 + 1101 = 10000 → 4비트만 쓰면 0000이 되니까 3 + (-3) = 0이에요.

여기서 1101의 맨 앞이 1이죠? 부호 있는 수일 때는 그게 부호 비트라서 "1 = 음수"라고 보는 거예요. 2의 보수로 만든 음수는 항상 맨 앞 비트가 1이에요.

시험 예: "8비트에서 -5의 2의 보수 표현" → 5 = 0000 0101 → 1의 보수 1111 1010 → 2의 보수 1111 1010 + 1 = 1111 1011. 맨 앞 1이 부호 비트(음수)예요.

문제 및 해설

8비트 부호 있는 수에서 -3의 2의 보수 표현은?

정답: 1111 1101

풀이 단계

  1. ① 양수 3을 8비트 2진수로 씁니다. 3 = 11₂이므로 앞을 0으로 채워 8자리로 → 0000 0011.
  2. ② 1의 보수: 0은 1로, 1은 0으로 바꿉니다. → 1111 1100.
  3. ③ 2의 보수: ② 결과에 1을 더합니다. 1111 1100 + 1 = 1111 1101. 이게 -3의 2의 보수 표현입니다.

왜 맨 앞이 1인가요? 부호 있는 수에서 맨 앞 비트는 부호 비트예요. 0이면 양수, 1이면 음수. 2의 보수로 만든 음수는 항상 맨 앞이 1이 됩니다.

한 줄 요약 양수 2진수 → 1의 보수(0↔1) → 2의 보수(+1). 결과의 맨 앞 1 = 부호 비트(음수).

문제 및 답 확인

아래 빈칸에 -5의 2의 보수를 구하는 과정을 한 단계씩 채워 보세요. ① 5를 8비트 2진수로 쓰고, ② 0과 1을 바꾼 1의 보수, ③ 그다음 1을 더한 2의 보수를 순서대로 입력한 뒤 [확인]을 누르세요.

① 5를 8비트 2진수로 → ② 1의 보수(0↔1) → ③ 2의 보수(②+1) 순서로 입력하세요.

도전과제

풀어 본 뒤 정답을 펼쳐 확인하세요.

도전 1. 게임에서 데미지 -3을 8비트 2의 보수로 표현하면? (3의 2진수 → 1의 보수 → 2의 보수)
정답 보기

정답: 11111101

3 = 00000011 → 1의 보수 11111100 → 2의 보수(+1) 11111101. 맨 앞 1은 부호 비트(음수). 게임에서 "데미지 -3"을 메모리나 패킷에 저장할 때 이런 비트열로 쓸 수 있어요.

도전 2. 8비트 부호 있는 정수에서 10000000₂(2의 보수)는 10진수로 얼마인가요? (맨 앞 1 = 음수, 나머지 비트로 크기 구한 뒤 음수 부호 붙이기)
정답 보기

정답: -128

2의 보수에서 10000000은 "가장 큰 음수"로, 10진수 -128이에요. 8비트 부호 있는 정수 범위는 -128 ~ 127. 게임에서 HP·스탯이 8비트로 저장되면 이 범위 안의 값만 쓸 수 있어요.

문제 및 실습

진법 변환과 보수 빈칸 채우기를 더 해 보세요.

성능·빅오는 5. 성능과 빅오, 리스트(append·pop) 실습은 6. 자료구조와 리스트에서 해요.

문자 인코딩

글자도 숫자로 바꿔서 저장해요. 그 규칙이 인코딩이에요.