Почему "i:= i + 1" не дает ошибку проверки диапазона для целых и больших типов?

Рассматривать:

{$R+}
i:= 1;
While i > 0 do
  i:= i + 1;
ShowMessage(IntToStr(i));

Если я заявляю i как Byte, Word, Shortint или TinyInt я получаю ошибку проверки диапазона, как и ожидалось. Если я заявляю i как LongWord, Cardinal, Integer, LongInt или Int64, он просто проходит через цикл while и получает отрицательное значение или значение 0, которое i получает, когда вы проходите верхнюю границу.

Delphi 7 не поддерживает проверку диапазона для 32-разрядных и 64-разрядных чисел?

1 ответ

Решение

Операция i + 1 на самом деле не приводит к ошибке проверки диапазона. Операция присваивания делает.

Delphi оценивает константу '1' как целое число, поэтому правая часть выдает результат, который является либо Int64, либо целым числом (чем больше тип i и целое число i).

Если мы расширим линию, мы получим следующее

temp := i + 1 
i := temp

temp будет 32 или 64 бита и переполнится, если достигнет верхней границы. К тому времени, когда мы выполняем присваивание, у нас есть совершенно правильное 32- или 64-битное значение, поэтому нет возможности сбоя проверки диапазона, если я 32-битный или более.

Если я меньше 32 бит, это повысит проверку диапазона, если температура слишком велика, чтобы соответствовать.

Для i >= 32bit вы можете отловить ошибку переполнения следующим образом:

{$R+,Q+}
...
Другие вопросы по тегам