8 / 37 · 개념
2의 보수, 부호 확장과 오버플로
비트열의 signed 해석과 덧셈 overflow 조건을 식과 반례로 구분합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
최상위 비트의 가중치가 달라집니다
비트 2의 보수2의 보수 고정 폭 비트열로 부호 있는 정수를 나타내는 방식입니다. n비트 범위는 −2^(n−1)부터 2^(n−1)−1까지입니다. 정수는 다음과 같이 해석합니다.
4비트 1010은 unsignedunsigned 비트열을 음수가 없는 정수로 해석하는 규칙입니다. n비트의 범위는 0부터 2^n−1이며, 같은 비트열의 signed 해석과 다를 수 있습니다. 자세히 보기로 10, signed로 -6입니다. 부호 비트만 떼고 나머지를 절댓값으로 읽는 방식이 아닙니다. 는 고정 폭에서 비트 반전부정 0을 1로, 1을 0으로 바꾸는 NOT 연산입니다. 수식 위의 선은 선 아래 식 전체에 NOT을 적용한다는 뜻입니다. 자세히 보기 후 1을 더해 만들지만, 최솟값 의 양수 +8은 같은 4비트 signed 범위에 없습니다.
확장은 값을 보존해야 합니다
unsigned 확장은 앞에 0을, signed 확장은 앞에 기존 부호 비트를 채웁니다. 1010을 00001010으로 바꾸면 +10이고, 11111010으로 바꾸면 -6입니다. 같은 비트를 넓히더라도 해석이 다르면 필요한 회로가 다릅니다.
logic signed [3:0] a, b;
logic signed [4:0] exact;
logic [3:0] result;
logic overflow;
assign exact = {a[3], a} + {b[3], b};
assign result = exact[3:0];
assign overflow = (a[3] == b[3]) && (result[3] != a[3]);이 예제는 carry 입력 없는 두 피연산자의 signed 덧셈입니다. exact에 5비트 합을 보존하고, 좁힌 결과의 부호가 올바른지 검사합니다.
11111010을 시작값으로 두었습니다. unsigned 250과 signed −6이 같은 비트열이라는 점을 확인하세요. b7을 바꾸면 두 해석의 값이 서로 다른 방향으로 변합니다.
11111010 → unsigned 250 · signed -6 · hex 0xFA
carry와 signed overflow는 다릅니다
같은 부호끼리 더했는데 결과 부호가 바뀌면 overflow입니다. 4비트에서 은 1010으로 저장되어 -6처럼 보이고, 은 0111로 저장되어 +7처럼 보입니다. 서로 다른 부호의 두 수를 더할 때는 이 범위 초과가 발생하지 않습니다.
signed와 unsigned를 섞은 RTL 표현식은 비교·확장 규칙을 헷갈리게 만듭니다. 두 피연산자의 폭과 signedness를 명시하고, 최솟값·-1·0·최댓값을 경계 테스트에 넣으세요.
직접 생각해 보기
4비트 signed에서 와 의 저장 비트열과 overflow를 구하세요. 을 negate한 결과도 설명하세요.
해설 보기
은 1001이며 overflow가 없습니다. 10은 범위를 벗어나 1010(-6)으로 저장되므로 overflow입니다. -8을 반전하고 1을 더하면 다시 1000이 남습니다. +8을 표현할 수 없기 때문이며, 이를 정상적인 절댓값 계산으로 사용하면 안 됩니다.