1 서론
캐리(Carry)와 오버플로우(Overflow)는 종종 혼돈되기도 하는데 그 차이점을 알아보자. 간략화를 위해 8비트의 이진수만을 고려한다. 나타낼 수 있는 수의 범위는 -128부터 +127 까지가 된다.
캐리는 최상위 비트(MSB)에서 그 위의 비트로 자리올림이 발생하는 것을 의미한다. 캐리 자체로는 오류 발생과 관련 없다.
반면 오버플로우는 연산 결과 값이 주어진 비트 수로 표현될 수 있는 범위를 넘긴 것을 의미한다. 수의 범위를 넘었기 때문에 오버플로우는 오류 발생을 의미한다.
다음 예제들을 살펴보자.
가) 1 + (-1) = 0
이진수로 계산하면 00000001 + 11111111 = 1 00000000 이 된다. MSB 에서 그 위의 비트로 자리 올림, 즉 캐리가 발생했다. 그러나 이 캐리는 무시된다. 하위 8비트는 올바른 답인 0 을 나타내고 있다.
나) 1 + 127 = 128
이진수로 계산하면 00000001 + 01111111 = 10000000 이 된다. 캐리는 발생하지 않았다. 그러나 결과 값인 이진수 10000000 은 십진수 -128 이며 올바른 답인 +128 이 아니다. +128 은 8비트 이진수로 나타낼 수 없는 값이다. 이 경우는 오버플로우가 발생했다.
위의 예제에서 보듯이 캐리는 단지 MSB 에서 그 위 비트로 자리 올림이 발생했음을 의미하는 것이며, 오버플로우는 연산 결과 값이 나타낼 수 있는 숫자 범위를 넘어선 것을 의미하는 것이다.
2 오버플로우의 판단
아래 그림처럼 8비트 이진수에서 LSB(최하위 비트)부터 MSB (최상위 비트) 까지 각각 0번부터 7번까지의 번호를 부여했다. C1, C2 는 각각 상위 비트로의 올림수를 의미하는데, C1 은 6번째 비트에서 7번째, 즉 MSB 로의 올림수이며, C2 는 7번째, 즉 MSB 에서 그 다음 위 비트로의 올림수를 의미한다. 일반적으로 캐리는 C2 를 의미한다.
C1 과 C2 의 값을 보면 오버플로우 여부를 알 수 있다. 즉 C1, C2 가 서로 다른 값이면 오버플로우가 일어난 것이다. 같은 값이면 오버플로우가 아니다. 다음 예제를 보자.
가) 1 + (-1) = 0
이진수로 계산하면 00000001 + 11111111 = 1 00000000 이 된다. 캐리는 발생했지만 C1 = 1, C2 = 1 의 같은 값이므로 오버플로우는 아니다.
나) 1 + 127 = 128
이진수로 계산하면 00000001 + 01111111 = 10000000 이 된다. 캐리는 발생하지 않았지만 C1 = 1, C2 = 0 의 다른 값이므로 오버플로우이다.
다) 1 + 1 = 2
이진수로 계산하면 00000001 + 00000001 = 00000010 이 된다. 캐리는 발생하지 않았으며 C1 = 0, C2 = 0 의 같은 값이므로 오버플로우가 아니다.
라) -128 + (-128) = -256
이진수로 계산하면 10000000 + 10000000 = 1 00000000 이 된다. 캐리가 발생했으며 C1 = 0, C2 = 1 의 다른 값이므로 오버플로우이다.
위 내용을 표로 정리하면 다음과 같다. C1, C2 가 같은 값이면 오버플로우가 아니며 다른 값이면 오버플로우이므로 오버플로우 여부는 C1 과 C2 의 exclusive-OR을 구하면 된다.
C1 | C2 | Example | Overflow |
0 | 0 | 1 + 1 = 2 | × |
0 | 1 | -128 + (-128) = 256 | ○ |
1 | 0 | 1 + 127 = 128 | ○ |
1 | 1 | 1 + (-1) = 0 | × |
[출처] 캐리와 오버플로우 - Carry & Overflow|작성자 hjyang0
'마이크로프로세서' 카테고리의 다른 글
501 ARM Mode와 PSR..너희들은 누구냐? (0) | 2014.04.08 |
---|---|
lab4_data processing instruction (0) | 2014.04.01 |
Hexadecimal Subtraction and Multiplication (0) | 2014.04.01 |
assembly format (0) | 2014.03.18 |
하버드 vs 폰노이만 (0) | 2014.03.18 |