Delphi: Как я использую $OVERFLOWCHECKS ПРОЧЬ для отключения водосливных проверок?

у меня есть бит кода, который вызывает потерю значимости:

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 опция, это все еще выдает исключение. И сгенерированный код все еще содержит проверку:

alt text

Напоминание документации относительно $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?

6
задан Glorfindel 28 June 2019 в 13:05
поделиться