본문으로 건너뛰기
code0.HDL

폭과 부호

2의 보수, 같은 비트 패턴이 읽는 방법에 따라 두 수가 되는 이유, 값을 넓히고 좁힐 때 일어나는 일, 사라진 자리올림과 오버플로의 차이를 다룹니다.

이 장에서 배울 내용

  • 하나의 비트 패턴을 부호 없는 수와 2의 보수로 각각 읽을 수 있습니다
  • 각 해석에서 폭을 넓히거나 줄이면 값이 어떻게 되는지 예측할 수 있습니다
  • 잃어버린 자리올림과 부호 있는 오버플로를 구분할 수 있습니다
이 장에서 배우는 개념
  • 2의 보수
  • 같은 비트 패턴의 부호 있는 해석과 부호 없는 해석
  • 확장과 절단
  • 자리올림과 오버플로
먼저 알아야 할 개념

1. 2의 보수는 최상위 비트의 자리값을 음수로 둡니다

버스에는 0과 1만 있으므로 음수는 패턴을 읽는 방법으로 만들어야 합니다. 2의 보수가 그 방법입니다. n비트 수에서 비트 n−1의 자리값을 +2^(n−1) 대신 −2^(n−1)로 두고, 나머지 비트의 자리값은 그대로 둡니다. 4비트에서는 비트 3의 자리값이 −8입니다. 패턴 1111은 −8 + 4 + 2 + 1 = −1이고, 1000은 −8, 0111은 7입니다. 범위는 −8부터 7까지입니다.

폭부호 없는 수2의 보수
4비트0 ~ 15−8 ~ 7
8비트0 ~ 255−128 ~ 127
n비트0 ~ 2^n − 1−2^(n−1) ~ 2^(n−1) − 1

아래 실험은 1111에서 시작하고 두 가지 읽기를 함께 보입니다. 비트 3 위의 자리값이 −8입니다. 비트를 눌러 보면서 2의 보수 칸이 1인 비트의 자리값을 모두 더한 값인지 확인하세요.

개념 실험 · 4-bit

컴파일한 설계가 아니라 브라우저 안의 회로 모델입니다. 실제 도구 체인은 예제에서 실행됩니다.

비트3210자리값-8421입력
부호 없는 수
15
2의 보수
-1
16진수
0xF

부호를 바꾸려면 모든 비트를 반전한 뒤 1을 더합니다. 5 = 0101을 반전하면 1010이고 1을 더하면 1011입니다. 1011은 −8 + 2 + 1 = −5입니다. 같은 두 단계를 −5에 적용하면 다시 5가 됩니다. 다만 가장 작은 음수는 예외입니다. 4비트의 1000을 같은 방법으로 반전하고 1을 더하면 다시 1000입니다. +8은 4비트 부호 있는 수의 범위 밖이므로, 양수 결과를 표현하려면 먼저 폭을 넓혀야 합니다.

2의 보수를 쓰는 까닭은 앞 단원의 가산기를 그대로 쓸 수 있다는 데 있습니다. 1111 + 0001은 10000이고, 다섯째 비트를 버리면 0000입니다. −1 + 1 = 0과 맞습니다.

확인 문제

4비트 패턴 1010을 2의 보수로 읽으면 얼마입니까?

2. 패턴 하나에 읽기가 둘입니다

회로는 패턴만 저장합니다. 1111이 15인지 −1인지는 읽는 쪽이 정하고, 두 읽기는 각자의 목적에 맞게 모두 옳습니다. 부호 있는 읽기에서는 최상위 비트가 부호를 알려 주며 1이면 음수입니다. 최상위 비트가 0인 패턴은 어느 쪽으로 읽어도 같은 값입니다. 0000부터 0111까지는 두 읽기 모두 0부터 7입니다.

두 읽기가 다른 패턴에서는 크기 비교도 달라집니다. 부호 없는 수로 1000은 8이고 0111인 7보다 큽니다. 2의 보수로 1000은 −8이고 7보다 작습니다. 한쪽 읽기에 맞춰 만든 비교기는 바로 그 패턴들에서 다른 쪽 읽기에 틀린 답을 냅니다.

부호 해석을 위한 별도 비트가 버스에 추가되는 것은 아닙니다. 타입·선언과 명시적 변환이 해석을 정하며, 구체적인 표기와 규칙은 각 언어 과정에서 다룹니다.

3. 확장은 새 비트를 읽기에 맞게 채워야 값을 보존합니다

4비트 값을 8비트 버스에 옮기면 왼쪽에 비트 네 개가 늘어나고, 그 비트에 값을 채워야 합니다. 0 확장은 새 비트를 0으로 채우고 부호 없는 읽기의 값을 보존합니다. 부호 확장은 새 비트를 원래 최상위 비트의 복사본으로 채우고 2의 보수 읽기의 값을 보존합니다. 원래 최상위 비트가 0이면 두 확장의 결과가 같습니다. 최상위 비트가 1일 때는 아래처럼 결과와 해석이 달라집니다.

4비트 패턴0 확장부호 확장
10100000101011111010
부호 없는 수로 읽기10, 원래와 같음250
2의 보수로 읽기10−6, 원래와 같음

반대 방향인 절단은 상위 비트를 버리고 하위 비트만 남깁니다. 버린 비트가 부호 없는 읽기에서는 모두 0, 부호 있는 읽기에서는 모두 새 최상위 비트의 복사본일 때만 값이 보존됩니다. 17은 5비트로 10001이고, 4비트만 남기면 0001, 곧 1입니다. 버린 1의 자리값 16이 사라졌습니다.

주의. 절단은 회로 안에서 아무 표시 없이 일어납니다. 선 네 개는 비트 네 개를 전달하고, 다섯째 비트가 있었다는 기록은 어디에도 남지 않습니다. 폭이 다른 값을 만났을 때 경고하는지, 컴파일 오류를 내는지, 자동으로 확장하는지는 언어마다 다른 규칙이며 각 언어 경로에서 가르칩니다.

확인 문제

4비트 패턴 1010을 8비트로 부호 확장하세요.

확인 문제

17을 4비트 부호 없는 신호에 저장했습니다. 신호가 가진 값은 얼마입니까?

4. 사라진 자리올림과 오버플로는 다른 실패입니다

둘 다 실제 결과가 폭에 들어가지 않았다는 뜻이지만, 속하는 읽기가 다르고 드러나는 방식도 다릅니다.

최상위 자리올림은 부호 없는 합에 비트가 하나 더 필요하다는 표시이지, 그 자체가 오류는 아닙니다. 4비트 수 두 개를 더하면 앞 장 마지막 단계의 cout인 다섯째 비트가 생길 수 있습니다. 9 + 8은 1001 + 1000 = 10001입니다. 결과를 4비트에 저장하면 0001, 곧 1이 남고 자리올림이 나타내던 16은 사라집니다. 이 일이 일어났다는 표시는 cout = 1 하나뿐입니다.

부호 있는 오버플로는 실제 합이 부호 있는 결과 범위를 벗어난 경우입니다. 7 + 1은 0111 + 0001 = 1000이고 cout는 0입니다. 1000을 2의 보수로 읽으면 −8입니다. 8이 −8부터 7까지의 범위 밖에 있으므로 양수 둘을 더해 음수가 나왔습니다. cout는 여기서 아무것도 알려 주지 않습니다. 부호 있는 오버플로는 부호로 판별합니다. 두 피연산자의 부호가 같고 결과의 부호가 다르면 오버플로입니다. 부호가 다른 두 수의 덧셈에서는 오버플로가 일어나지 않습니다.

읽기결과가 들어가지 않는 조건드러나는 방식4비트 예
부호 없는 수실제 합이 2^n 이상cout = 19 + 8은 0001, cout 1
2의 보수실제 합이 −2^(n−1) ~ 2^(n−1) − 1 밖피연산자 부호가 같고 결과 부호가 다름7 + 1은 1000, 곧 −8

해결 방법은 두 경우에 같습니다. 결과를 피연산자보다 1비트 넓게 둡니다. 부호 없는 수는 cout를 비트 n으로 보존하고, 2의 보수는 두 피연산자를 먼저 1비트 부호 확장한 뒤 더합니다.

확인 문제

4비트 부호 있는 가산기가 7 + 1을 계산했고 결과가 −8로 읽힙니다. 무슨 일이 일어났습니까?

답

확인 문제

4비트 부호 없는 가산기가 9 + 8을 계산해 1을 저장했습니다. 17을 올바르게 저장할 수 있는 최소 결과 폭은 몇 비트입니까?

5. 변형: 부호 있는 범위에 맞는 폭

−20부터 20까지의 모든 값을 담아야 하는 신호가 있습니다. 범위의 양 끝을 모두 확인해야 합니다. 최솟값 −2^(n−1)은 −20 이하여야 하고, 최댓값 2^(n−1) − 1은 20 이상이어야 합니다. 5비트는 −16부터 15까지여서 양 끝을 모두 담지 못합니다. 6비트는 −32부터 31까지이므로 필요한 범위를 담습니다. 부호 없는 수로 0부터 20까지라면 5비트로 충분합니다. 부호에 비트 하나가 쓰이는 만큼 크기의 범위가 줄어듭니다.

확인 문제

2의 보수로 −20부터 20까지의 모든 값을 담는 최소 폭은 몇 비트입니까?

6. 정리

  • 2의 보수에서 최상위 비트의 자리값은 −2^(n−1)입니다. n비트는 −2^(n−1)부터 2^(n−1) − 1까지 담습니다.
  • 버스는 패턴을 저장하고, 타입·선언과 명시적 변환이 부호 해석을 정합니다.
  • 0 확장은 부호 없는 값을, 부호 확장은 2의 보수 값을 보존합니다. 절단은 상위 비트를 표시 없이 버립니다.
  • 덧셈에서 cout는 부호 없는 합이 원래 폭을 넘었는지 나타냅니다. 부호 있는 오버플로는 같은 부호의 두 수를 더해 반대 부호가 나올 때 발생합니다. 피연산자를 알맞게 확장하고 결과 폭을 1비트 늘리면 전체 합을 보존할 수 있습니다.
  • 폭이 다른 값의 처리 규칙은 언어마다 다릅니다.

지금까지의 회로에는 저장된 상태가 없습니다. 다음 장에서는 한 클록 에지에서 다음 에지까지 값을 붙잡아 두는 레지스터를 다룹니다.

확인 지점

이 장의 확인 문제에 답하세요