부호 있는 정수를 2의 보수 이진수 및 16진수로 변환하거나, 이진 문자열을 부호 있는 10진수로 해석합니다. 8, 16, 32, 64비트를 지원합니다.
입력
입력
레지스터의 비트 수. 비트 폭은 이진 출력의 길이와 표현 가능한 부호 있는 정수의 범위를 결정합니다. N비트 레지스터는 −2^(N−1)부터 2^(N−1) − 1까지의 정수를 저장할 수 있습니다.
인코딩할 부호 있는 정수. 선택한 비트 폭 N에 대해 −2^(N−1)까지의 음수를 표현할 수 있습니다.
결과
값을 입력하면 계산 결과가 표시됩니다.
표현
-42의 8비트비트 2의 보수 인코딩. 가독성을 위해 4비트(니블) 단위로 묶어 표시합니다.
동일한 비트 패턴을 16진수로 표기한 값으로, 0x 접두사가 붙습니다. 16진수 한 자리는 정확히 4개의 이진 비트를 나타냅니다.
8비트비트 2의 보수 레지스터에 저장할 수 있는 최솟값과 최댓값입니다.
2의 보수
2의 보수(two's complement)는 디지털 컴퓨터가 부호 있는 정수를 저장하고 연산하는 표준 방식입니다. x86, ARM, RISC-V 등 모든 주류 CPU 아키텍처는 정수 연산 유닛에 2의 보수를 사용합니다. 이 인코딩을 택하면 뺄셈을 덧셈 회로로 처리할 수 있고, 0의 비트 패턴이 정확히 하나뿐이라는 특성이 있습니다.
인코딩 방식
N비트 2의 보수 레지스터는 개의 서로 다른 비트 패턴을 가집니다. 절반은 비음수 정수(에서 ), 나머지 절반은 음수(에서 )를 나타냅니다. 핵심 특성은 최상위 비트(가장 왼쪽 비트)가 부호 비트 역할을 한다는 점입니다. 0이면 비음수, 1이면 음수입니다.
비음수 정수의 인코딩은 일반 부호 없는 이진수와 동일합니다. 예를 들어 8비트 레지스터에서 42는 다음과 같이 표현됩니다.
음수의 2의 보수 계산
N비트 레지스터에서 음수 ()의 2의 보수 인코딩은 을 더해 구합니다.
8비트에서 의 경우: . 이를 이진수로 니블 단위로 묶으면 다음과 같습니다.
21410=110101102=0xD6
비트 반전 후 1을 더하는 절차로도 동일한 결과를 얻을 수 있습니다.
비트 반전:
1 더하기: ✓
2의 보수 값 읽기
이진 문자열을 부호 있는 10진수로 변환할 때는 부호 비트를 먼저 확인합니다.
첫 번째 비트가 0이면 비음수입니다. 일반 부호 없는 이진수로 읽으면 됩니다: .
첫 번째 비트가 1이면 음수입니다. 부호 없는 이진수로 읽은 값에서 을 빼면 됩니다: 이므로 .
표현 가능 범위
부호 비트는 부호 없는 범위를 절반으로 나눕니다. N비트 레지스터의 표현 범위는 다음과 같습니다.
비트 폭
최솟값
최댓값
8비트
−128
127
16비트
−32,768
32,767
32비트
−2,147,483,648
2,147,483,647
64비트
−9,223,372,036,854,775,808
9,223,372,036,854,775,807
범위가 비대칭인 점에 주목할 필요가 있습니다. 표현 가능한 음수가 양수보다 항상 하나 더 많습니다. 0이 비음수 슬롯 하나를 차지하기 때문에 양수는 개인 반면 음수는 개입니다.
오버플로
연산 결과가 표현 가능 범위를 벗어나면 값이 반대쪽으로 되돌아가는 오버플로(overflow)가 발생합니다. 8비트 레지스터에서 127에 1을 더하면 이 되는데, 이 비트 패턴은 −128을 나타냅니다. 하드웨어는 오버플로 플래그를 설정하여 소프트웨어가 이를 감지하고 처리할 수 있도록 하지만, 비트 연산 자체는 단순한 모듈러 덧셈입니다.
부호 절댓값 방식과의 비교
부호 절댓값(sign-magnitude) 방식은 1비트를 부호에, 나머지 N−1비트를 절댓값에 사용하는 대안적 인코딩입니다. 이 방식에는 두 가지 단점이 있습니다. 첫째, 0의 표현이 양의 0()과 음의 0() 두 가지로 존재하여 비교 연산에 특수 처리가 필요합니다. 둘째, 부호가 다른 수의 덧셈에는 어느 피연산자가 더 큰지 판단하고 덧셈과 뺄셈 중 무엇을 수행할지 결정하는 별도의 로직이 필요합니다.
2의 보수는 이 두 문제를 모두 해결합니다. 단일 덧셈 회로로 모든 경우를 처리할 수 있으며, 0의 표현은 하나뿐입니다.
자주 묻는 질문 (FAQ)
부호 절댓값 방식 대신 2의 보수를 사용하는 이유는 무엇입니까?
부호 절댓값(sign-magnitude) 방식은 별도의 비트에 부호를 저장하고 나머지 비트로 절댓값을 표현합니다. 이 방식에는 두 가지 문제가 있습니다. 첫째, 0의 표현이 양의 0과 음의 0으로 두 가지 존재합니다. 둘째, 덧셈과 뺄셈에 서로 다른 회로가 필요합니다.
2의 보수는 이 두 가지 문제를 모두 해결합니다. 0의 비트 패턴이 하나뿐이며, 동일한 이진 덧셈 회로로 양수와 음수 연산을 예외 없이 처리할 수 있습니다. 이러한 단순성 덕분에 현대의 모든 CPU가 정수 연산에 2의 보수를 사용합니다.
8비트 부호 있는 정수의 표현 범위는 어떻게 됩니까?
8비트 2의 보수 정수는 총 256개의 값을 표현할 수 있으며, 범위는 −128에서 127입니다. 가장 작은 값인 −128의 비트 패턴은 10000000이고, 가장 큰 값인 127은 01111111입니다. 음수 쪽이 양수보다 하나 더 많은 이유는 0이 비음수 슬롯 하나를 차지하기 때문입니다.
N비트 레지스터의 범위는 −2^(N−1)부터 2^(N−1) − 1까지입니다. 16비트의 경우 −32,768에서 32,767, 32비트의 경우 −2,147,483,648에서 2,147,483,647입니다.