2010-03-10 6 views
5

내가 언더 플로우가 발생합니다 코드의 비트를 가지고 :

var 
    t1, t2, delta: DWORD: 
begin 
    t1 := 0xffffff00; 
    t2 := 0x00000037; 

    delta := (t2 - t1); 

빼기 자체 가 오버 플로우 (언더)를 생성 않습니다,하지만 난 델파이는 EIntOverflow 예외를 throw하지 않습니다. 그래서 내가 오버 플로우 검사를 비활성화하여 오버 플로우 검사 코드의 생성을 중지 해보세요

var 
    t1, t2, delta: DWORD: 
begin 
    t1 := 0xffffff00; 
    t2 := 0x00000037; 

{$OVERFLOWCHECKS OFF} 
    delta := (t2 - t1); 
{$OVERFLOWCHECKS ON} 

을하지만 심지어 OVERFLOWCHECKS OFF 옵션, 여전히 예외가 발생합니다.

alt text http://i43.tinypic.com/intmrl.jpg

$Q에 대한 문서의 알림 :

오버플로 확인

유형 스위치
구문 {그리고 생성 된 코드는 여전히 체크를 포함 $ Q +} 또는 {$ Q-}
{$ OVERFLOWCHECKS ON} 또는 {$ OVERFLOWCHECKS OFF}
기본 {$ Q-}
{$ OVERFLOWCHECKS OFF}
범위 지역

비고

은 $ Q 지시문은 오버플로 검사 코드 생성을 제어합니다. 은 {$ Q +} 상태에서 특정 정수 산술 연산 (+, -, *, 애비, SQR, SUCC, Pred를 가산하여, Inc의 12월)가 오버플로 검사된다. 각 정수 연산 연산에 대한 코드 다음에 이 지원 범위 내에 있는지 확인하는 추가 코드가옵니다. 오버플로 검사에 실패하면 EIntOverflow 예외가 발생합니다 (또는 예외 처리가 이 활성화되지 않은 경우 프로그램이 종료 됨).

$ Q 스위치는 일반적 에이블 범위 및 검사 코드의 생성을 비활성화하여 $ R 스위치 와 함께 사용된다. 오버플로를 사용하도록 설정하면 프로그램이 느려지고 은 약간 더 커지므로 디버깅에만 {$ Q +} 을 사용하십시오.

$OVERFLOWCHECKS OFF을 사용하여 오버플로 확인 코드 생성을 비활성화하려면 어떻게합니까?


메이슨의 답변.수정 된 코드는 다음과 같습니다.

var 
    t1, t2, delta: DWORD: 
begin 
    t1 := 0xffffff00; 
    t2 := 0x00000037; 

    delta := Subtract(t2, t1); 


{$OVERFLOWCHECKS OFF} 
function Subtract(const B, A: DWORD): DWORD; //subtract B-A 
begin 
    { 
     Disabling overflow checking does not work at the line level, 
     only the routine level. 
     Hence the function to subtract two numbers. 
    } 
    Result := (B-A); 
end; 
{$OVERFLOWCHECKS ON} 

Google 크롤러의 경우 대체 질문 문법 : Delphi에서 오버플로 검사를 일시적으로 사용 중지하는 방법은 무엇입니까?

답변

12

라인 레벨에서는 작동하지 않습니다. 전체 기능에 대해 해제해야합니다.

+0

이 컴파일러 옵션과 다른 컴파일러 옵션 - 특히 $ RANGECHECKS ...에 대한 설명서는 매우 흥미 롭습니다. 그러나 +1 "이 대답이 유용합니다.) –

+3

범위 검사 *는 줄 단위로 작동합니다. 오버플로 검사는 함수 수준에서만 작동하며 컴파일러가 'end'에 도달 한 시점에서 설정이 유효하더라도 전체 함수의 기계 코드를 생성하는 데 사용됩니다.이 방법은 문서화되어 있지 않지만 영원히 작동합니다 –

+0

줄 수준에서 {$ Q +/-}를 사용하는 일부 Delphi 코드에서 얻었습니다. 회신에서 언급 한대로 {$ OVERFLOWCHECKS ON/OFF}로 전환하면 위의 예제에서이 함수가 전체 함수를 둘러싸 기 위해이 응답이 가리키는 것처럼 오버 플로우 검사를 해제 할 수 있었지만 줄 수준 {$ Q +/-} c를 제거해야했습니다. 이미 존재하는 ompiler 지시어 또는 여전히 오버플로 예외가 있습니다. –

관련 문제