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비트) 타입은 바로 이 경계에서 값이 되돌아갑니다.
자주 묻는 질문
여담 ― 컴퓨터가 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는 오버플로우가 조용히 랩어라운드된다고 명시적으로 규정하고 있어, 동일한 비트 표현이라도 언어에 따라 동작 보장 수준이 크게 다를 수 있다는 흥미로운 사례를 보여줍니다.