함께 배우는 수업 · 컴퓨터/정보

2의 보수와 부호 있는 정수

컴퓨터가 음수를 표현하는 3가지 방식(부호화 절대값, 1의 보수, 2의 보수)을 비교하고, 덧셈기만으로 뺄셈을 수행하는 2의 보수 체계를 이해합니다.

이 수업에서 해 볼 일

  • 비트 폭을 고정하고 2의 보수와 오버플로를 구별한다

먼저 알면 좋은 것: 2진수 체계와 자릿값 원리 · 비트 단위 논리 반전(NOT) 개념 · 최상위 비트(MSB)와 최하위 비트(LSB)

오늘의 목표

가입 없이 시작할 수 있어요. 설명을 읽고, 함께 연습한 뒤, 처음 보는 문제에서 직접 확인합니다.

판단 과정과 비교 사례

2의 보수 정수는 비트 폭을 먼저 정해야 해석할 수 있다. n비트에서 최상위 비트의 가중치만 −2ⁿ⁻¹이고 나머지는 양수이다.예를 들어 8비트 11111010은 −128+64+32+16+8+2=−6이다. 또는 모든 비트를 반전하고 1을 더해 절댓값을 구한 뒤 음수로 읽는다.자리올림과 부호 있는 오버플로는 구분하자. 같은 부호끼리 더했는데 결과 부호가 달라지면 표현 범위를 벗어났는지 점검해야 한다.

1. 음수 표현 방식의 진화: 부호화 절대값, 1의 보수, 2의 보수

부호 있는 정수(Signed Integer)에서는 가장 왼쪽의 최상위 비트(MSB, Most Significant Bit)를 부호 비트(0: 양수, 1: 음수)로 사용합니다. 1. 부호화 절대값 (Sign-Magnitude): MSB만 부호로 쓰고 나머지 비트는 양수의 절대값 그대로 표기합니다. - 예(8비트): +5=000001012+5 = 00000101_2, −5=100001012-5 = 10000101_2. - 한계: +0(000000002)+0(00000000_2)과 −0(100000002)-0(10000000_2) 두 개의 0이 존재하며, 양수와 음수를 더할 때 부호를 따로 비교해야 해서 하드웨어 회로가 복잡해집니다. 2. 1의 보수 (One's Complement): 양수의 모든 비트를 반전(0↔10 \leftrightarrow 1)시켜 음수를 표현합니다. - 예(8비트): +5=000001012→−5=111110102+5 = 00000101_2 \rightarrow -5 = 11111010_2. - 한계: 여전히 +0(000000002)+0(00000000_2)과 −0(111111112)-0(11111111_2)이 공존하며, 덧셈 시 최상위 자리올림수(Carry)를 다시 맨 끝자리에 더해주는 순환 자리올림(End-around Carry) 연산이 필요합니다. 3. 2의 보수 (Two's Complement): 1의 보수(전체 비트 반전)를 취한 뒤 11을 더하여 음수를 표현합니다. - 예(8비트): +5(000001012)→반전111110102→+1111110112(−5)+5(00000101_2) \xrightarrow{\text{반전}} 11111010_2 \xrightarrow{+1} 11111011_2 (-5).2의 보수를 구하는 초고속 지름길: 오른쪽 끝(LSB)에서부터 왼쪽으로 읽어가며 '첫 번째 1이 나올 때까지(그 1을 포함하여)'는 그대로 두고, 그 왼쪽의 모든 비트만 반전시키면 한 번에 2의 보수가 완성됩니다!

2. 2의 보수를 사용하는 결정적 이유와 표현 범위

- 0이 유일하게 하나만 존재: 00000000200000000_2에 2의 보수를 취하면 111111112+1=(1)00000000211111111_2 + 1 = (1)00000000_2가 되어, 캐리(1)가 버려지고 똑같은 00000000200000000_2이 됩니다. 이로 인해 남는 비트 패턴 10000000210000000_2을 음수 최솟값(−128-128)으로 추가 할당할 수 있습니다. - nn비트 정수 표현 범위 비교: - 부호 없는 정수 (Unsigned): 0∼2n−10 \sim 2^n - 1 (8비트 기준 0∼2550 \sim 255) - 1의 보수 / 부호화 절대값: −(2n−1−1)∼+(2n−1−1)-(2^{n-1} - 1) \sim +(2^{n-1} - 1) (8비트 기준 −127∼+127-127 \sim +127) - 2의 보수 (Signed): −2n−1∼+(2n−1−1)-2^{n-1} \sim +(2^{n-1} - 1) (8비트 기준 −128∼+127-128 \sim +127, 음수가 1개 더 많음!) - 가산기(Adder) 하나로 뺄셈 처리: - A−B=A+(−B)A - B = A + (-B)이므로, BB를 2의 보수로 변환해 더한 뒤 최상위 비트 밖으로 밀려난 자리올림수(Carry-out)를 단순 무시하면 뺄셈 결과가 정확히 도출됩니다.

예제로 살펴보기

8비트 2의 보수 체계에서 7 - 5 연산을 덧셈 과정으로 수행하고, 10010110₂가 나타내는 10진수 값을 구하시오.
  1. 1) 7 - 5 = 7 + (-5)로 변환합니다. +7 = 00000111₂ +5 = 00000101₂ ➔ 1의 보수: 11111010₂ ➔ +1(2의 보수): 11111011₂ (-5) 2) 두 이진수를 더합니다: 00000111₂ + 11111011₂ = (1)00000010₂ 8비트를 초과한 최상위 캐리 (1)을 버리면 00000010₂ = +2가 되어 뺄셈이 정확히 성립합니다. 3) 10010110₂는 MSB가 1이므로 음수입니다. 양수 절대값을 구하기 위해 다시 2의 보수를 취하면: 비트 반전(01101001₂) + 1 = 01101010₂ = 64 + 32 + 8 + 2 = 106. 따라서 10010110₂의 10진수 값은 -106입니다.
확인: 2의 보수는 모든 비트를 반전(1의 보수)시킨 뒤 1을 더하여 구하며, 최상위 비트(MSB)가 1이면 음수다.

3. 정수 오버플로우(Overflow)와 산술 시프트 주의점

- 정수 오버플로우(Arithmetic Overflow): 연산 결과가 할당된 비트 수의 표현 범위를 벗어나는 현상입니다. - 부호가 같은 두 수를 더했는데 결과의 부호 비트(MSB)가 원래 부호와 반대로 뒤집히면 오버플로우가 발생한 것입니다. - 예: 8비트에서 127(011111112)+1(000000012)=100000002=−128127(01111111_2) + 1(00000001_2) = 10000000_2 = -128. 양수에 1을 더했는데 음수 최솟값으로 래핑(Wrapping)되는 현상으로, 실제 아리안 5호 로켓 폭발 사고나 게임 재화 버그의 원인이 되었습니다. - 논리 시프트 vs 산술 시프트: - 음수를 오른쪽으로 시프트(>>)할 때 빈자리에 무조건 0을 채우면(논리 시프트) 음수가 양수로 바뀌는 참사가 일어납니다. 따라서 부호 있는 정수는 원래의 부호 비트(MSB, 음수면 1)를 복사해서 채우는 산술 시프트(Arithmetic Shift)를 수행합니다.8비트 2의 보수에서 최솟값인 -128(10000000₂)에 절댓값 함수 abs()를 취하거나 부호를 반전(-x)시키면, +128을 표현할 수 없어 다시 -128이 되는 오버플로우 버그가 발생하므로 코딩 테스트와 보안 로직에서 각별히 주의해야 합니다.

참고 근거와 확인 범위

설명·예제·문제 구성 및 오류 수정 책임: 프리런. 위 자료는 표시한 주제를 확인하거나 더 읽기 위한 근거이며, 외부 기관의 공식 수업이나 감수본을 뜻하지 않습니다.

참고 자료 연결 점검: 2026-11-02. 제작 방식·검수 범위와 수정 기록에서 확인 범위를 볼 수 있습니다. 오류는 상단의 의견 보내기 또는 contact@freelearn.io로 알려 주세요.

이 단원의 개념서 읽기 →