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

Операция я + 1 фактически не вызывает ошибку проверки диапазона. Операция присваивания выполняется.

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

Если разложить линию, получим следующее

temp := i + 1 
i := temp

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

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

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

{$R+,Q+}
...