- •14. Порядковые типы данных
- •14.1. Перечислимые типы
- •14.1.1. Синтаксис и значение выражений перечислимого типа.
- •14.1.2. Ввод-вывод для перечислимых типов.
- •14.1.3. Сравнение дат.
- •14.2. Тип boolean
- •14.2.1. Синтаксис логических выражений.
- •14.2.2. Значение логических выражений.
- •14.2.4. Поиск в файле.
- •14.3. Тип integer.
- •14.2.3. Ввод-вывод логических значений.
- •14.3.1. Подсчет пробелов.
- •14.3.2. Ввод-вывод целочисленных значений.
- •14.3.3. Переполнение.
- •14.3.4.Синтаксис целочисленных выражений.
- •14.3.5. Значение целочисленных выражений.
- •14.3.6. Преобразование символов в числа.
- •14.4. Тип диапазон.
- •14.4.1. Присваивания для диапазонов.
- •14.4.2. Преобразование температур.
- •14.5. Проектирование и анализ с порядковыми типами.
- •14.5.1. Правила проектирования.
- •14.5.2. Анализ программ.
- •14.6. Заключение.
14.3.3. Переполнение.
Целочисленные операции Паскаля производят корректные результаты только тогда, когда операнды и результа этих операций находится в пределах [-MAXINT, MAXINT]. Для операции сложения, график показывает пунктиром область корректности результатов для X + Y.
За пределами границ обозначенных MAXINT, сложение не производит корректных результатов. Из графика видно, что для двух произвольно выбранных целых чисел в одном случае из четырех результат для целочисленных операций моежт оказаться некорректным – ¼ часть области ограниченной +/- MAXINT не производит корректные результаты.
Аналогично для корректных результатов операции X-Y показанных на следующем графике.
Снова здесь вероятность ¼ что произойдет переполнение с двумя произвольными целыми числами.
Поскольку умножение может произвести большие знаечния легче, чем сложение и вычитание, вероятность преполнения здесь выше. Область корректных результатов для операции X*Y представлена на графике ниже.
Границы области представлены гиперболами, график выполнен с искажением масштаба. На самом деле площадь области корректных результатов существенно меньше. В одном квадранте, площадь подкривой Y = MAXINT/X задается:
=
MAXINT + MAXINT ln MAXINT – MAXINT ln 1
Таким образом, площадь подкривой будет MAXINT + MAXINT ln MAXINTб тогда как площадь области ограниченной операндами MAXINT2, поэтому в случае произвольного выбора операндов, переполнение не произойдет с вероятностью:
=
Для MAXINT = 216 = 65535, вероятность не переполнения в случае произвольного выбора операндов будет:
или менее 2 на 10000.
В противоположность сложению, вычитанию и умножению, DIV и MODне производят переполнения:
Очевидно, что тип INTEGER представляет только небольшую, частичную модель математических целых чисел. При соблюдении ограничений операции будут отлично выполняться, но Паскаль-машина не занимается соблюдением таких ограничений, это должен делать программист.
Реализация работы с MAXINT зависит от реализации Паскаль-машины. То, что значение MAXINT может быть определено опытным путем на каждой машине можно скорее отнести к недостаткам Паскаля.Поэтому для разработки стабильного кода нужно быть внимательным. На некоторых машина вычисления останавливаются при переполнении, поэтому его можно безопасно игнорировать, пока программа не начнет давать сбои. Однако на большистве машин результат просто не будет соотвествтвовать значению соотвествующей арифметической операции.
14.3.4.Синтаксис целочисленных выражений.
Дополненный синтаксис для целочисленнных выражений Паскаля приведен ниже.
<выражение> ::= <простое выражение>
| <простое выражение><оператор сравнения><простое выражение>
<простое выражение> ::= <простое выражение> <аддитивный оператор> <терм>
| <терм> | <знак> <терм>
<терм> ::= <терм> <мультипликативный оператор> <множитель> | <множитель>
<множитель> ::= <переменная> | <беззнаковая константа> | (выражение) | NOT <множитель>
<оператор сравнения> ::= = | <> | < | <= | > | >=
<знак> ::= + | -
<аддитивный оператор> ::= + | - | OR
<мультипликативный оператор> ::= * | DIV | MOD | AND
<переменная> ::= <идентификатор переменной>
<беззнаковая константа> ::= <беззнаковое число> | <идентификатор константы>
| <строка символов>
<беззнаковое число> ::= <беззнаковое целое>
