Почему "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+}
...