我有一些代碼,導致下溢:
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}
對於谷歌爬行器,替代問題措辭:如何暫時禁用德爾福溢出檢查?
我會很感興趣的,看到這個和其他編譯器選項的文檔 - 特別是'$ RANGECHECKS' ...但+1「這個答案很有用) – 2010-03-10 16:07:37
範圍檢查*確實*工作在行級別。溢出檢查只能在函數級別進行,無論編譯器到達「end」時的哪一個設置生效,都將用於生成整個函數的機器碼,但沒有這種方式記錄,但這是永久性的工作方式。優化也只適用於函數級別;這是記錄的 – 2010-03-10 16:30:10
我從Delphi代碼中得到了一些在線級別使用{$ Q +/-}的代碼。通過切換到回覆中提到的{$ OVERFLOWCHECKS ON/OFF}上面,但是用它們來包圍整個函數,就像這個回覆指出的那樣,我可以關閉溢出檢查,但是我必須刪除行級{$ Q +/-} c ompiler指令已經存在,或者我仍然有溢出異常。 – 2011-05-17 23:43:29