basic

심화-캐리와 오버플로우의 차이점

sylviaisthebest 2024. 5. 30. 14:03

캐리와 오버플로우

- 캐리: 정상적으로 자리올림수가 발생하는 과정에서 발생

- 오버플로우: 표현할 수 있는 수의 범위에서 벗어날 때 발생

 

수의 표현

이진수의 정수 표현

 최상위 비트(MSB)를 부호비트로 사용

- 양수(+): 0 - 음수(-):1

• 2진수 음수를 표시하는 방법- 컴퓨터마다 다름

- 부호의 절대치 (sign-magnitude)

    +0 00000000

    -0 10000000

- 1의 보수 one's complement

- 2의 보수 two's complement (★컴퓨터가 이 방식을 많이 쓴다.)

이진수의 8비트 표현 범위 -128~+127

2**8 = 256

 

가장 왼쪽에는 양수와 음수를 구분하는 숫자 (0,1)를 넣어준다.

 

캐리 Carry

덧셈 연산의 자연스러운 자리올림

덧셈 연산 시 최상위 비트에서 그 위의 비트로 자리 올림 발생

 

 11 <- carry

  49

+58

-----

107

 

  

   0110 000 <- carry

   0011 0001

+ 0011 1010

------------

   0110 1011

 

오버플로우 overflow

ex) 8비트에서는 -128~127로 표현할 수 있다고 했는데, 이 범위를 벗어나는 것 덧셈 뺄셈 햇을 때 일정한 크기의 비트수에서 표현할 수 있는 수의 범위에서 벗어나는 것

오버플로우와 언더플로우

- 변수는 서로 자신만의 크기를 가짐

- 표현 가능한 최소값보다 작은 값이 발생하면 언더플로우

- 표현 가능한 최대값보다 큰 값이 발생하면 오버플로우

오버플로우

- 합이나 차의 결과가 크기 비트로 표현될 수 있는 것보다 클 경우 부호화 이진수의 부호비트로 캐리가 에러가 되는 현상

- 결과는 잘못된 값이 나오게 된다(양수나 음수가 된다).

ex)

- 1 + (-1) = 0

00000001 + 11111111 = 1 00000000

캐리가 발생하였으나, 자릿수를 넘어섰기 때문에 무시되고 하위 8비트만 출력하게 되어 올바른 답인 0을 나타냄: overflow가 아님

- 1 + 127 = 128

00000001 + 01111111 = 10000000

캐리가 발생하였으며, 1 + 127 = 10진수로 128이나 2진수 연산 결과 -128이 나오게 됨: overflow가 발생

=> 캐리는 단지 MSB에서 그 위 비트로 자리 올림이 발생했음을 의미하며, 오버플로우는 연산 결과가 나타낼 수 있는 숫자 범위를 넘어선 것이다.

 

* 추가 자료

=====================================================

The CARRY flag and OVERFLOW flag in binary arithmetic

=====================================================

- Ian! D. Allen - idallen@idallen.ca - www.idallen.com 

 

Ian! D. Allen - Personal Home Page

Principles only mean something if you stick by them when they are inconvenient. -- "Laine Hanson" (played by Joan Allen) from the movie "The Contender" "It takes two people to make a relationship difficult, but it takes only one person to make a relationsh

www.idallen.com

 

정수형 carry와 overflow

 

정수 연산에서 'carry' 플래그와 'overflow' 플래그를 혼동하면 안된다.  각 플래그는 단독으로 발생하거나 둘 다 함께 발생할 수 있다. CPU의 ALU는 정수 연산을 할 때 항상 두 플래그를 모두 적절하게 설정하며, 부호화된 연산을 하는지 부호화되지 않은 연산을 하는지는 신경 쓰지 않거나 알지 못한다. ALU는 부호/부호 없음에 대해 알지 못하며, 단지 이진 수학을 수행하고 플래그를 적절하게 설정할 뿐이다. 연산이 완료된 후 어떤 플래그를 확인할지는 프로그래머에게 달려 있다.

 

프로그램에서 단어의 비트를 부호 없는 숫자로 취급하는 경우 산술에 캐리 플래그가 설정되어 결과가 잘못되었음을 나타내는지 확인해야 한다. 부호 없는 연산을 할 때는 overflow 플래그는 신경 쓰지 않아도 된다.  (오버플로 플래그는 부호가 없는 숫자가 아니라 부호가 있는 숫자와만 관련이 있다.)

 

프로그램에서 단어의 비트를 2의 보수 부호 값으로 처리하는 경우 산술에서 오버플로 플래그가 설정되어 결과가 잘못되었음을 나타내는지 확인해야 한다. 부호화된 2의 보수 연산을 할 때는 캐리 플래그에 신경 쓰지 않아도 된다. (캐리 플래그는 부호가 없는 숫자와만 관련이 있고 부호가 있는 숫자와는 관련이 없다.)

 

부호 없는 산술 unsigned arithmetic 에서는 carry를 관찰하여 오류를 감지한다.
부호 없는 산술 unsigned arithmetic 에서 overflow는 아무 것도 알려주지 않는다.

부호 있는 산술 signed arithmetic 에서는 overflow를 관찰하여 오류를 감지한다.
부호 있는 산술 signed arithmetic 에서 carry는 흥미로운 정보를 알려주지 않는다.

 

carry flag

이진/정수 수학에서 carry를 켜는 규칙은 두 가지이다:
1. 두 숫자를 더하면 가장 큰(가장 왼쪽) 비트가 추가되는 경우 캐리 플래그가 설정된다.

1111 + 0001 = 0000 (carry flag is turned on)

 

2. 두 숫자를 뺄 때 가장 큰(가장 왼쪽) 비트를 뺀 값에 차용이 필요한 경우에도 carry(borrow)가 설정된다.

0000 - 0001 = 1111 (carry flag is turned on)

 

그렇지 않으면 캐리 플래그가 꺼진다(zero).

 * 0111 + 0001 = 1000 (carry flag is turned off [zero])

 * 1000 - 0001 = 0111 (carry flag is turned off [zero])

 

부호 없는 산술에서는 carry를 관찰하여 오류를 감지한다.
부호 있는 산술에서 carry는 아무 것도 알려주지 않는다.

overflow flag

1. 부호 비트가 꺼진 두 숫자의 합이 부호 비트가 켜진 결과 숫자를 산출하면 overflow가 켜진다.
0100 + 0100 = 1000 (overflow flag is turned on)


2. 부호 비트가 켜진 두 숫자의 합이 부호 비트가 꺼진 결과 숫자를 산출하면 overflow가 켜진다.

1000 + 1000 = 0000 (overflow flag is turned on)


그렇지 않으면 overflow가 꺼진다.

 * 0100 + 0001 = 0101 (overflow flag is turned off)

 * 0110 + 1001 = 1111 (overflow flag is turned off)

 * 1000 + 0001 = 1001 (overflow flag is turned off)

 * 1100 + 1100 = 1000 (overflow flag is turned off)

 

ALU가 오버플로 플래그를 계산하는 방법

2의 보수 이진 연산에서 오버플로 오류를 감지하는 몇 가지 자동화된 방법이 있다.

 

[Method 1]

overflow는 같은 부호의 두 숫자를 더하고 다른 부호를 얻을 때만 발생할 수 있습니다.  따라서 overflow를 감지할 때는 부호 비트를 제외한 다른 비트는 신경 쓰지 않는다. 다른 비트는 무시한다.

피연산자가 두 개이고 결과가 하나이므로 고려해야 할 부호 비트가 세 개(각각 1 또는 0)이므로 정확히 2**3=8개의 가능한 비트 조합이 있다. 가능한 8가지 경우 중 두 가지 경우만 오버플로로 간주된다.


아래는 두 피연산자와 결과의 부호 비트이다:

 

뺄 때도 같은 표를 반복할 수 있다.

양수를 빼는 것은 음수를 더하는 것과 같으므로 오버플로 플래그를 트리거하는 조건은 다음과 같음:

 

컴퓨터에는 위의 네 가지 OV 조건 중 하나라도 충족되면 오버플로 플래그를 “1”로 설정하는 작은 논리 게이트 배열이 포함될 수 있다.

부호가 있는 수학을 할 때 같은 부호의 숫자 두 개를 더하면 같은 부호의 결과가 나와야 하며, 그렇지 않으면 오버플로가 발생하고 CPU에 오버플로 플래그가 설정된다는 점만 기억하면 된다.

 

[Method 2]

두 이진 값을 더할 때는 가장 왼쪽(부호 비트)으로 들어오는 이진 캐리와 가장 왼쪽에서 나가는 이진 캐리를 고려한다.  (가장 왼쪽 [부호] 비트에서 나가는 캐리는 ALU에서 CARRY 플래그가 됩니다.)

2의 보수에서 오버플로는 왼쪽 열에서 비트가 캐리될 때 발생하는 것이 아니라, 비트가 캐리되고 일치하는 캐리가 발생하지 않을 때 발생할 수 있다. 즉, 부호 비트에 캐리는 있지만 부호 비트에서 캐리가 발생하지 않을 때 오버플로가 발생한다.

오버플로우 플래그는 부호 비트에 들어오는 캐리(있는 경우)와 부호 비트에서 나가는 캐리(있는 경우)의 XOR이다.

캐리 인이 캐리 아웃과 같지 않으면 오버플로가 발생한다.

 

결론

캐리 != 오버플로우

캐리가 발생하면서 오버플로우가 발생할 수 있다.

 

 

출처

https://youtu.be/LOsZUCHxRyY?si=9jTU6yV6URnQshq8

https://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt