2의 보수 계산기 (부호 있는 정수 2진수 변환)

부호 있는 10진수를 8/16/32/64비트의 2의 보수 2진수 패턴으로 변환하거나, 그 반대로 변환합니다. 부호 없는 정수로의 해석, 16진수 표기도 함께 표시하며 범위를 벗어난 값도 감지합니다.

사용 팁

  • 8비트 부호 있는 정수의 범위는 -128~127입니다. 127을 입력한 뒤 128을 입력해 보면 오버플로우 경계를 확인할 수 있습니다. 128은 범위를 벗어나 오류가 발생하는데, 바로 그 지점이 -128로 되돌아가는(랩어라운드) 경계입니다.
  • "부호 없는 10진수" 행은 최상위 비트를 부호로 취급하지 않고 같은 비트 패턴을 그대로 읽은 값입니다. 부호 있는 행과 비교하면 두 해석 방식의 차이를 바로 확인할 수 있습니다.
  • 2진수 입력은 선택한 비트 폭과 정확히 같은 자릿수여야 합니다. 8비트라면 8자리, 16비트라면 16자리를 정확히 입력하세요.
  • 64비트 계산은 JavaScript의 Number 타입 대신 내부적으로 BigInt를 사용하므로, 2^63에 가까운 값도 오차 없이 변환됩니다.
  • 이 도구는 C나 Java 같은 언어의 정수 오버플로우 동작을 이해하는 데도 유용합니다. int(32비트)·long(64비트) 타입은 바로 이 경계에서 값이 되돌아갑니다.

자주 묻는 질문

부호-크기 표현과 1의 보수 표현은 모두 0에 대해 "+0"과 "-0"이라는 서로 다른 두 가지 비트 패턴을 갖게 되어 비교 및 연산 회로가 복잡해집니다. 2의 보수는 0에 대한 비트 패턴이 단 하나이며, 마찬가지로 중요한 점으로 덧셈에 쓰는 회로를 그대로 뺄셈에도 사용할 수 있습니다. 이 두 가지 특성 덕분에 CPU 설계자는 산술논리연산장치를 단순화할 수 있으며, 이것이 거의 모든 현대 프로세서가 내부적으로 부호 있는 정수에 2의 보수를 사용하는 이유입니다.

-128~127입니다. 최상위 비트가 부호용으로 예약되어 있어 양수 쪽에는 128가지(0~127)의 패턴만 존재하지만, 음수 쪽은 128가지 값(-1~-128)을 표현할 수 있습니다. 이는 2의 보수에서 0에 대한 비트 패턴이 하나뿐이어서 남는 패턴 하나를 음수 쪽에 더 배정할 수 있기 때문이며, 이 때문에 범위가 비대칭이 됩니다.

1의 보수는 양수 값의 모든 비트를 단순히 반전시켜 음수를 만듭니다. 2의 보수는 여기서 한 단계 더 나아가 반전한 뒤 1을 더합니다. 이 추가 단계 덕분에 1의 보수에 내재된 "두 개의 0 문제"(00000000이 "+0", 11111111이 "-0")가 사라지며, 이것이 2의 보수가 표준으로 자리 잡은 이유입니다.

비트 폭이 고정되어 있기 때문에, 표현 가능한 범위를 넘어서는 연산 결과는 상위 비트가 잘려나가면서 부호 비트의 의미가 바뀌게 됩니다. 예를 들어 8비트 부호 있는 최댓값 127에 1을 더하면 비트 패턴은 10000000이 되는데, 부호 있는 규칙으로 해석하면 이는 -128을 의미합니다. 상한을 넘어서면 하한으로 되돌아가는, 직관에 어긋나는 이 현상이 바로 오버플로우입니다.

비트 패턴 자체는 바뀌지 않지만, 최상위 비트를 부호로 취급하지 않으므로 모든 비트가 각자의 자릿값을 그대로 값에 반영합니다. 예를 들어 8비트 패턴 11111011은 부호 있는 값으로 읽으면 -5이지만, 부호 없는 값으로 읽으면 251이 됩니다. C 언어의 unsigned int처럼 "부호 없는" 타입을 이전에는 부호 있는 값으로 다루던 값에 적용할 때 실제로 이런 재해석이 일어납니다.
ツールくん

여담 ― 컴퓨터가 2의 보수를 사용하는 이유

2진수로 음수를 표현하는 방법이 2의 보수만 있는 것은 아닙니다. 역사적으로는 최상위 비트를 단순히 부호 표시로만 쓰는 "부호-크기 표현"과, 양수의 비트를 그대로 반전시키기만 하는 "1의 보수 표현"도 사용되었습니다. 그러나 두 방식 모두 공통된 결함이 있습니다. 0을 나타내는 비트 패턴이 "+0"과 "-0" 두 가지로 존재하게 되어 비교 연산과 회로 설계가 복잡해지는 것입니다. 2의 보수 표현에서는 이 "두 개의 0 문제"가 발생하지 않으며, 비트 패턴과 정수값이 정확히 1대1로 대응합니다.

2의 보수의 더 큰 장점은 덧셈에 사용하는 회로를 그대로 뺄셈에도 쓸 수 있다는 점입니다. 어떤 수를 빼는 것은 그 수의 2의 보수를 더하는 것과 같기 때문입니다. CPU는 값이 양수인지 음수인지 신경 쓸 필요 없이 단순히 비트 패턴끼리 더하기만 하면 항상 올바른 결과를 얻습니다. 이 덕분에 산술논리연산장치(ALU)는 별도의 뺄셈 전용 회로를 둘 필요가 없어져 구조가 단순해지며, 이것이 현대의 거의 모든 CPU 아키텍처가 부호 있는 정수 표현 방식으로 2의 보수를 채택한 이유입니다.

정수 오버플로우 현상도 이 표현 방식의 직접적인 결과입니다. 8비트 부호 있는 최댓값 127(01111111)에 1을 더하면 비트 패턴은 단순히 10000000으로 올라가는데, 이를 부호 있는 값으로 해석하면 -128이 됩니다. C 언어에서 부호 있는 정수의 오버플로우는 기술적으로 "정의되지 않은 동작"으로 취급되어, 컴파일러 최적화에 따라 이 경계 근처에서 예기치 않은 결과가 나올 수 있으므로 실제 코드에서는 각별한 주의가 필요합니다. 반면 Java는 오버플로우가 조용히 랩어라운드된다고 명시적으로 규정하고 있어, 동일한 비트 표현이라도 언어에 따라 동작 보장 수준이 크게 다를 수 있다는 흥미로운 사례를 보여줍니다.