2010-07-28 4 views
0

대부분의 컴파일러는 코드에서 이전에 수행 한 추가 연산이 캐리를 발생시키는 지 확인할 수 있습니까? 예를 들어산술 연산 후 워드 크기의 변수에 캐리가 있는지 확인하십시오.

:

런타임 조건 때문에 컴파일러의 도메인에 있지이다
unsigned int n = 0xFFFFFFFF; // 8 F's 
// doing some stuff here ... 
n = n + 1; 
// doing some stuff here, without changing the value of @var n 
if (n > UINT_MAX) { 
    // n has a carry 
} 
+0

네, 많은 컴파일러가 이것을 자동으로 탐지하는 코드를 생성 할 수 있습니다. 하지만 C 컴파일러는 아닙니다. –

+0

니스, 도움이되고 냉소적 인 말 Hans – Dor

+0

Ian Wetherbee와 Scott M. 모두 도움이되었지만 이안이 먼저 대답했습니다. 그래서 나는 그의 대답을 받아 들였고 Scott의 대답을지지했습니다. 모두 감사합니다 – Dor

답변

2

부호없는 int는 예제에서 0으로 랩됩니다 (c 구현에서 32 비트 부호없는 int를 사용한다고 가정). 컴파일러는 랩 어라운드 여부를 알 수 없으므로 결과를 확인해야합니다. 가산의 결과는 피연산자들 중 하나보다 작다면 통상의 C

if (n > n + 1) { /* wrap around */ } 
2

. 실제로 carry 연산의 CPU 상태는 플래그에 영향을주는 다음 명령어로 손실됩니다.

프로그램 코드에서 이러한 오버플로를 감지해야합니다.

+0

컴파일러는'n = n + 1'의 연산 결과를 숨겨진 변수에 저장하겠습니까? 나중에 컴파일러가 C++에서 때로는 다른 경우와 마찬가지로 사용합니다. – Dor

+0

'n = n + 1 '을 구성하는 기계 명령어는 CPU 플래그에 영향을 미칩니다. 컴파일러는 연산에 필요한 경우 플래그를 고려한 코드를 생성합니다 (예 : 레지스터 크기보다 큰 변수). 그 순차 지점을 넘어서는 그렇지 않습니다. –

+0

OK, 10x, +1도 있습니다. – Dor

4

오버 플로우가 발생했을 경우 (적어도 부호와의 int) 말할 방법이다. 이것은 오버플로를 나타냅니다. 내가 아는 한, 예외 나 초과 통보는 없습니다.

빠른 구글 검색 : 불행하게도, C에서이 캐리 비트 직접 액세스 할 수있는 방법이 없습니다

http://www.fefe.de/intof.html

.

관련 문제