오버플로우(Overflow)란?
오버플로우는 컴퓨터 연산에서 값이 표현할 수 있는 범위를 초과하여 발생하는 오류이다. 보통 정수형 연산에서 발생하며, 특히 부호 있는 정수(signed integer) 연산에서 중요한 개념이다.
1. 오버플로우 발생 조건
오버플로우는 다음과 같은 경우에 발생할 수 있다.
- 덧셈(Addition)
- 같은 부호의 두 수를 더했을 때, 결과가 표현할 수 있는 범위를 초과하는 경우
- 뺄셈(Subtraction)
- 서로 다른 부호의 두 수를 뺐을 때, 결과가 표현할 수 있는 범위를 초과하는 경우
- 곱셈(Multiplication)
- 두 수를 곱했을 때, 결과가 표현할 수 있는 범위를 초과하는 경우
하지만 보통 덧셈과 뺄셈에서 오버플로우를 먼저 고려한다.
2. 2의 보수에서 오버플로우 발생 조건
컴퓨터에서 정수는 2의 보수(Two's Complement) 표현을 사용하므로, 부호 있는 정수 연산에서 오버플로우가 발생하는지 확인하는 방법이 있다.
* 2의 보수 계산법 = 1의 보수로 변환 후 1 더하기 (0,1 바꾼 후 1만 더해주기!)
(1) 덧셈(+)의 경우
- 두 양수를 더했을 때 결과가 음수가 나오면 오버플로우 발생
- 두 음수를 더했을 때 결과가 양수가 나오면 오버플로우 발생
✅ 오버플로우 발생 여부 공식
Carry into MSB ≠ Carry out of MSB
즉, 최상위 비트(MSB, Most Significant Bit)로 들어가는 캐리와 최상위 비트에서 나오는 캐리가 다르면 오버플로우가 발생한다.
예제 (8-bit, 2의 보수 표현)
0111 0000 (112)
+ 0100 0000 (64)
-------------
1011 0000 (-80) → 오버플로우 발생 (원래 176이어야 함)
위 예제에서 두 양수를 더했지만 결과가 음수가 되어 오버플로우가 발생했다.
(2) 뺄셈(-)의 경우
뺄셈 연산은 사실 덧셈으로 변환하여 수행된다. 즉,
A − B = A + (−B)
로 변환되므로, 뺄셈에서 오버플로우가 발생하는 조건은 덧셈과 동일하다.
다만, 이때 -B는 B의 2의 보수 표현을 의미한다.
- 양수에서 음수를 뺐을 때 결과가 음수가 나오면 오버플로우
- 음수에서 양수를 뺐을 때 결과가 양수가 나오면 오버플로우
예제 (8-bit, 2의 보수 표현)
0111 0000 (112)
- 1010 0000 (-96) → 0111 0000 + 0110 0000 (96)
-------------------
1101 0000 (-48) → 오버플로우 발생 (원래 208이어야 함)
위와 같이 부호가 뒤집힌 경우 오버플로우가 발생한다.
3. 오버플로우 확인 방법 (코드 예제)
오버플로우를 확인하는 기본적인 코드 예제를 보자.
module overflow_check (
input signed [31:0] a, // First operand
input signed [31:0] b, // Second operand
input op, // 0: Addition, 1: Subtraction
output logic overflow // Overflow flag
);
logic signed [31:0] result;
logic carry_in, carry_out; // Carry signals
always @(*) begin
if (op == 0) // Addition
result = a + b;
else // Subtraction (a - b = a + (~b + 1))
result = a - b;
// Overflow condition: Carry into MSB ≠ Carry out of MSB
carry_in = a[31] ^ b[31]; // Carry into MSB
carry_out = a[31] ^ result[31]; // Carry out of MSB
overflow = ~carry_in & carry_out;
end
endmodule
4. 정리
- 덧셈: 같은 부호의 두 숫자를 더했을 때, 부호가 바뀌면 오버플로우 발생
- 뺄셈: A - B를 수행할 때, B의 부호를 바꾸어 덧셈을 한 후 덧셈과 동일한 오버플로우 체크
- 2의 보수 연산에서는 최상위 비트(MSB)의 캐리 비트 비교로 오버플로우를 판별 가능
- C나 Python에서는 직접적인 오버플로우는 발생하지 않지만, 하드웨어 수준에서는 예외 처리가 필요함
'Verilog-Basic' 카테고리의 다른 글
Comparator 설계 (0) | 2024.08.06 |
---|---|
All Bit Zero/One Detector 설계 (0) | 2024.08.06 |
9 Bit Parity Generator 설계 (0) | 2024.07.15 |
Encoder/Decoder 설계 (0) | 2024.07.13 |
ALU(Arithmetic Logic Unit, 산술 논리 연산 장치) - ALU 74181 설계 (0) | 2024.07.11 |