2014-02-23 2 views
1

그래서 내가 책을 읽을 때 같은 부호의 다른 부호와 뺄셈을 추가 할 때 오버 플로우가 발생할 수 없다고 말합니다. 하지만 다음과 같은 질문이 있습니다. 185 - 122 122의 2 진수를 2의 보수로 변환하고 다른 부호 인 추가를 수행했습니다. 185 + (- 122) 그리고 이들을 더할 때 부호가 생깁니다. 비트가 100111111로 오버플로됩니다. 그러나 왼쪽의 MSB를 잘라 내면 올바른 대답입니다. 오버플로입니까?오버 플로우 연산입니까?

답변

1

아니요, 오버플로가 아닙니다. MSB에 2 1's이 추가되어 발생하는 오버플로를 그냥 버려야합니다. 부터 Wikipedia

이진수의 2의 보수를 얻으려면 비트가 비트 NOT 연산을 사용하여 반전되거나 "반전됩니다". 1의 값은 다음 예 (122)의 2의 보수를받는

185 10111001 
122 01111010 - 

에 따라서 0

의 2의 보수를 촬영할 때 발생하는 오버 플로우 (하나의 무시 얻어진 값에 더해지는 보완 +1)

01111010 => 10000110 

추가 :

10111001 185 
10000110 +(-122) 
-------- 
00111111 (63) 

= 63

overflow은 무시됩니다.

그러나 2의 보수 수행 한 후 오버 플로우를 검출하기위한 규칙이 있습니다

  • 하는 경우를 부정적인 결과
  • 만약에 두 개의 긍정적 인 숫자의 합이 개 음수 결과 긍정적 인 결과
  • 의 합
+0

@ 로젠 - CPU의/ALU가 2의 보수를 내부적으로 사용하는 이유에 대한 자세한 답변이 http://stackoverflow.com/q/6853524/314291에 있습니다. 분명히, 최종 사용자로서, 우리는 예를 들어, 인텔에서 빼기 위해'SUB '사용) – StuartLC