[컴퓨터 구조] 캐리와 오버플로우 확실하게 구분하기

ZzoeE·2020년 5월 14일
1

컴퓨터구조

목록 보기
1/1

컴퓨터 구조에 대해 조금이라도 배운 사람이라면 캐리와 오버플로우에 대해 떠오르는 것이 있을 것이다. 캐리는 아마 가산기가 떠오르지 않을까 생각된다. 이진수 1과 1을 더하면 출력(S)은 0, 자리올림이 발생해 캐리(C)는 1이 세팅되는 것이 기억날 것이다. 오버플로우는 개발하면서 정말 많이 들어봤을 것이다. 말 그대로 표현할 수 있는 값 범위를 넘어서다 라고 이해하고 있을 것이다.

캐리와 오버플로우에 대해 한 종류의 레지스터를 바탕으로 자세히 설명해보고자 한다. 레지스터는 프로세서 내부에서 데이터를 일시적으로 저장하는 아주 빠른 기억 장소이다. 다양한 레지스터 중에서, 특수 레지스터인 상태 레지스터를 알아보자.


상태 레지스터


상태 레지스터는 마이크로 프로세서에 탑재되는 레지스터이다. 이미지를 자세히 들여다보면 32개의 비트, 즉 4 byte 크기인 것을 알 수 있다. 각 비트는 다양한 산술 연산 결과 상태를 저장한다. 크게 제어 플래그와 조건 플래그로 나뉘는데, 이중 우리가 집중할 것은 조건 플래그의 오버플로우 플래그와 캐리 플래그이다.

먼저 오버플로우 플래그는 말 그대로 오버플로우 발생 시 Set 될 것이라고 예상할 수 있다. 마찬가지로 캐리 플래그 또한 자리 올림이 발생하면 Set이 될 것으로 예상된다. 2가지 상황의 플래그 상태를 예측해보도록 하자.


플래그 상태 예측하기

🔎 1

첫 번째, 이진수 1111과 0001의 더하기 연산이다. 결과 값은 10000으로 쉽게 계산할 수 있다. 그러나 4 bit 연산인데 결과 값은 5 bit로 표현할 수 있는 범위를 넘겼다. 이는 오버플로우가 발생한 것이므로 레지스터의 상태는 다음과 같이 예측할 수 있다.

🔎 2

두 번째, 이진수 0111과 0001의 더하기 연산이다. 결과 값은 1000으로, 오버플로우는 발생하지 않았다. 대신 자리 올림이 발생했으므로 캐리 플래그가 Set 될 것이다.


진짜 플래그 상태

🔎 1

10000은 표현 범위를 넘겼기 때문에 위에서 오버플로우 플래그 Set으로 예상했지만, 이 경우에는 캐리 플래그가 Set된다.

10000은 1이 무시되지만 캐리가 일어난 것은 맞기 때문에 캐리 플래그가 Set 된다. 하지만 오버플로우 플래그가 Set 되지 않는 것은 결국 결과는 0으로, 하위 4 bit가 알맞은 값을 제대로 표현하고 있기 때문이다. 따라서 이 경우 캐리가 발생한 것이고, 오버플로우는 발생하지 않았다.

🔎 2


0111 + 0001의 연산으로 0이었던 최상단이 1로 바뀌었기 때문에 캐리의 발생으로 오해할 수 있다. 하지만 캐리 플래그는 최상단 비트에서 캐리가 발생했을 때 Set된다. 이 경우에서는 최상단 비트에서는 캐리가 발생하지 않고 있기 때문에 캐리 플래그는 Set되지 않는다. 대신 오버플로우 플래그가 Set되는데, 이유는 부호이다.


양수인 71을 더하는 연산의 결과가 -8이기 때문이다. 4 bit 이진수가 표현 가능한 범위는 7 ~ -8 로, 올바른 결과인 8은 애초에 나타낼 수 없는 값이 아니라서 잘못된 결과가 나타난다. 즉, 부호가 있는 연산에서 최대표현 숫자를 넘어서서 잘못된 결과가 나타난 경우 오버플로우 플래그가 Set 되는 것이다. 오버플로우 여부는 같은 부호를 더했을 때, 다른 부호가 나오는 것으로도 인지할 수 있다.


정리

상태 레지스터의 캐리 플래그는 최상단 비트에서 자리올림 발생 시 Set

상태 레지스터의 오버플로우 플래그는 최대 표현 숫자를 넘기거나, 같은 부호를 더했을 때의 결과가 다른 부호 일 시 Set

0개의 댓글