у меня есть бит кода, который вызывает потерю значимости:
var
t1, t2, delta: DWORD:
begin
t1 := 0xffffff00;
t2 := 0x00000037;
delta := (t2 - t1);
Само вычитание генерирует переполнение (потеря значимости), но я не хочу, чтобы Delphi бросил EIntOverflow
исключение. Таким образом, я пытаюсь отключить поколение кода проверки переполнения путем отключения проверки переполнения:
var
t1, t2, delta: DWORD:
begin
t1 := 0xffffff00;
t2 := 0x00000037;
{$OVERFLOWCHECKS OFF}
delta := (t2 - t1);
{$OVERFLOWCHECKS ON}
Все же даже с OVERFLOWCHECKS OFF
опция, это все еще выдает исключение. И сгенерированный код все еще содержит проверку:
Напоминание документации относительно $Q
:
Проверка переполнения
Введите переключатель
Синтаксис {$Q +} или {$Q-}
{$OVERFLOWCHECKS НА} или {$OVERFLOWCHECKS ПРОЧЬ}
Значение по умолчанию {$Q-}
{$OVERFLOWCHECKS ПРОЧЬ}
Локальный объемКомментарии
Директива $Q управляет поколением кода проверки переполнения. В {$Q +} состояние, определенные целочисленные арифметические операции (+, - *, Брюшной пресс, площадь, Succ, Pred, Inc, и декабрь) проверяются на переполнение. Код для каждой из этих целочисленных арифметических операций сопровождается дополнительным кодом, который проверяет, что результат в поддерживаемом диапазоне. Если водосливная проверка перестала работать, исключение 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?
Это не работает на линейном уровне. Вам нужно отключить его на всю функцию.