2010-03-10 33 views
5

我有一些代碼,導致下溢:

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

    delta := (t2 - t1); 

減法本身產生溢出(下溢),但我不希望德爾福拋出EIntOverflow例外。所以我儘量通過禁止溢出檢查禁用的溢出檢查代碼的生成:然而,即使在OVERFLOWCHECKS OFF選項

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

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

,它仍然會拋出異常。而生成的代碼仍然包含檢查:

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

的文件上$Q提醒一下:

溢出檢查

類型開關
語法 { $ Q +}或{$ Q-}
{$ OVERFLOWCHECKS ON}或{$ OVERFLOWCHECKS OFF}
默認 {$ Q-}
{$ OVERFLOWCHECKS OFF}
範圍本地

備註

的$ Q指令控制着 代溢出檢查代碼。 在{$ Q +}的狀態,某些整數 算術運算(+, - ,*,ABS, SQR,SUCC,強的鬆,公司,和十二月)是 檢查溢出。 代碼爲 這些整數運算中的每一個操作後面跟有附加的 代碼,用於驗證結果在支持的範圍內是否爲 。如果 溢出檢查失敗,將引發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} 

對於谷歌爬行器,替代問題措辭:如何暫時禁用德爾福溢出檢查?

回答

12

它在行級別不起作用。您需要關閉整個功能。

+0

我會很感興趣的,看到這個和其他編譯器選項的文檔 - 特別是'$ RANGECHECKS' ...但+1「這個答案很有用) – 2010-03-10 16:07:37

+3

範圍檢查*確實*工作在行級別。溢出檢查只能在函數級別進行,無論編譯器到達「end」時的哪一個設置生效,都將用於生成整個函數的機器碼,但沒有這種方式記錄,但這是永久性的工作方式。優化也只適用於函數級別;這是記錄的 – 2010-03-10 16:30:10

+0

我從Delphi代碼中得到了一些在線級別使用{$ Q +/-}的代碼。通過切換到回覆中提到的{$ OVERFLOWCHECKS ON/OFF}上面,但是用它們來包圍整個函數,就像這個回覆指出的那樣,我可以關閉溢出檢查,但是我必須刪除行級{$ Q +/-} c ompiler指令已經存在,或者我仍然有溢出異常。 – 2011-05-17 23:43:29