Дельфы:Как мне использовать $OVERFLOWCHECKS OFF, чтобы отключить проверки переполнения?

StackOverflow https://stackoverflow.com/questions/2418272

Вопрос

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

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

   delta := (t2 - t1);

Само вычитание делает генерируйте переполнение (underflow), но я не хочу, чтобы 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-}
{$ ПРОВЕРКИ НА ПЕРЕПОЛНЕНИЕ ВКЛЮЧЕНЫ} или {$ ПРОВЕРКИ НА ПЕРЕПОЛНЕНИЕ ВЫКЛЮЧЕНЫ}
По умолчанию {$Q-}
{$ ПРОВЕРКА НА ПЕРЕПОЛНЕНИЕ ОТКЛЮЧЕНА}
Область применения Местные новости

Замечания

Директива $Q управляет генерацией кода проверки переполнения.В состоянии {$Q+} определенное целое число арифметические операции (+, -, *, Abs, Sqr, Succ, Pred, Инк, и Декабрь) являются проверяются на переполнение.Код для каждой из этих целочисленных арифметических операций сопровождается дополнительным кодом, который проверяет, что результат находится в пределах поддерживаемого диапазона.Если проверка переполнения завершается неудачей, 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 crawler альтернативная формулировка вопроса:Как временно отключить проверку переполнения в Delphi?

Это было полезно?

Решение

Это не работает на линейном уровне.Вам нужно отключить его для всей функции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top