본문 바로가기

논리회로

오버플로우(Overflow) 조건

원문 : http://www.c-jump.com/CIS77/CIS77syllabus.htm


1. 오버플로우란?


계산과정에서 결과값이 현재 데이터의 용량에 비해 너무 크거나 너무 작을 때 생기는 현상이다.


오버플로우가 발생하는 예는 다음과 같다.

부호있는 2진 보수 숫자 2개가 더해질 때(뺄셈도 당연히 포함된다) 

①두개의 숫자가 양수일 때 결과값이 음수거나 

②두개의 숫자가 음수일 때 결과값이 양수일 때 

부호없는 숫자가 더해질 때 

①최상위 비트를 넘어가는 carry가 발생할 때 



2. 2진 계산에서의 오버플로우



보통 속도상의 이유로 컴퓨터 자체는 signed과 unsigned을 구별하지 못하며 따라서 구별하는 것은 우리의 몫이다.

특히 덧셈과 뺄셈의 계산 후 오버플로우의 조건을 아는 것이 중요한데, signed과 unsigned에 따라 조금 다르다.


3. unsigned에서의 오버플로우


unsigned의 계산에서는 단지 최상위 비트에서 발생하는 carry만 확인하면 되므로 탐지 회로는 다음과 같다.



4. signed에서의 오버플로우


2개의 숫자를 더했을 때 최상위 비트의 수준에서 오버플로우가 발생하는 모든 경우의 수를 표로 작성하면 다음과 같다.

INPUTSOUTPUTS
AsignBsignCARRY INCARRY OUTSUMsignOVERFLOW
0 0 0 0 0 0
0 0 1 0 1 1
0 1 0 0 1 0
0 1 1 1 0 0
1 0 0 0 1 0
1 0 1 1 0 0
1 1 0 1 0 1
1 1 1 1 1 0


따라서 오버플로우가 발생하는 경우는 다음과 같다.

①최상위 비트가 둘다 0이고 carry in이 1일 때 결과값이 1이므로 오버플로우 발생(양수를 더했는데 결과값이 음수)

②최상위 비트가 둘다 1이고 carry in이 0일 때 결과값이 0이므로 오버플로우 발생(음수를 더했는데 결과값이 양수) 


표를 보면 보면 오버플로우는 최상위 비트에서의 carry in과 carry out이 다를 때 발생한다는 것을 알수있다.

  • CARRYin ≠ CARRYout

다시 정리하면 오버플로우는 carry in XOR carry out가 1일 때 발생한다.

  • Cin XOR Cout =1


탐지 회로는 다음과 같다.