Дельфы:Как мне использовать $OVERFLOWCHECKS OFF, чтобы отключить проверки переполнения?
-
19-09-2019 - |
Вопрос
у меня есть фрагмент кода, который вызывает недостаточный поток:
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
вариант, он по-прежнему выдает исключение.И сгенерированный код по-прежнему содержит проверку:
Напоминание о документации по $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?
Решение
Это не работает на линейном уровне.Вам нужно отключить его для всей функции.