Справочник по Ada 95
3.5.4 Целочисленные типы
Определение integer_type_definition задаёт целочисленный тип; оно определяет либо тип знаковых целых чисел, либо тип модулярных целых чисел. Базовый диапазон знакового целочисленного типа включает по меньшей мере значения указанного диапазона. Модулярный тип — это целочисленный тип, где все арифметические операции выполняются по модулю указанного положительного модуля; такой тип соответствует беззнаковому типу с семантикой переполнения.
Синтаксис
integer_type_definition ::= signed_integer_type_definition | modular_type_definition
signed_integer_type_definition ::= range static_simple_expression .. static_simple_expression
modular_type_definition ::= mod static_expression
Правила разрешения имён
Каждая simple_expression в signed_integer_type_definition должна быть любого целочисленного типа; они не обязаны быть одного типа. Выражение expression в modular_type_definition также должно быть любого целочисленного типа.
Правила легальности
simple_expressionы в signed_integer_type_definition должны быть статическими, и их значения должны лежать в диапазоне System.Min_Int .. System.Max_Int.
Выражение expression в modular_type_definition должно быть статическим, его значение (модуль) должно быть положительным и не должно превышать System.Max_Binary_Modulus, если это степень двойки, или System.Max_Nonbinary_Modulus в противном случае.
Статическая семантика
Множество значений для знакового целочисленного типа — это (бесконечное) множество математических целых чисел, хотя только значения базового диапазона типа полностью поддерживаются для операций во время выполнения. Множество значений для модулярного целочисленного типа — это значения от 0 до значения, на единицу меньшего, чем модуль, включительно.
signed_integer_type_definition определяет целочисленный тип, чей базовый диапазон включает по меньшей мере значения simple_expression и симметричен относительно нуля, за исключением, возможно, дополнительного отрицательного значения. signed_integer_type_definition также определяет ограниченный первый подтип типа с диапазоном, границы которого заданы значениями simple_expression, преобразованными в тип, который определяется.
modular_type_definition определяет модулярный тип, чей базовый диапазон — от нуля до значения, на единицу меньшего, чем заданный модуль. modular_type_definition также определяет ограниченный первый подтип типа с диапазоном, совпадающим с базовым диапазоном типа.
Существует предопределённый подтип знаковых целых чисел с именем Integer, объявленный во видимой части пакета Standard. Он ограничен базовым диапазоном своего типа.
Integer имеет два предопределённых подтипа, объявленных во видимой части пакета Standard:
subtype Natural is Integer range 0 .. Integer'Last;
subtype Positive is Integer range 1 .. Integer'Last;
subtype Positive is Integer range 1 .. Integer'Last;
Тип, определённый integer_type_definition, неявно выводится из root_integer, безымянного предопределённого (специфического) целочисленного типа, чей базовый диапазон — System.Min_Int .. System.Max_Int. Однако базовый диапазон нового типа не наследуется от root_integer, а определяется диапазоном или модулем, указанным в integer_type_definition. Целочисленные литералы все принадлежат типу universal_integer, универсальному типу (см. 3.4.1) для класса, укоренённого в root_integer, позволяя использовать их с операциями любого целочисленного типа.
Позиционный номер целочисленного значения равен самому значению.
Для каждого модулярного подтипа S определён следующий атрибут:
- S'Modulus
- S'Modulus возвращает модуль типа S в виде значения типа universal_integer.
Динамическая семантика
Развёртывание integer_type_definition создаёт целочисленный тип и его первый подтип.
Для модулярного типа, если результат выполнения предопределённого оператора (см. 4.5) выходит за пределы базового диапазона типа, результат уменьшается по модулю модуля типа до значения, находящегося в пределах базового диапазона типа.
Для знакового целочисленного типа исключение Constraint_Error возбуждается при выполнении операции, которая не может предоставить правильный результат, потому что он находится вне базового диапазона типа. Для любого целочисленного типа Constraint_Error возбуждается операторами "/", "rem", и "mod", если правое операнд равно нулю.
Требования к реализации
В реализации диапазон Integer должен включать диапазон -2**15+1 .. +2**15-1.
Если для реализации предопределён Long_Integer, то его диапазон должен включать диапазон -2**31+1 .. +2**31-1.
System.Max_Binary_Modulus должен быть не меньше 2**16.
Разрешения для реализации
Для выполнения предопределённой операции знакового целочисленного типа реализация не обязана возбуждать Constraint_Error, если результат находится за пределами базового диапазона типа, при условии, что правильный результат получается.
Реализация может предоставить дополнительные предопределённые типы знаковых целых чисел, объявленные во видимой части Standard, чьи первые подтипы имеют имена вида Short_Integer, Long_Integer, Short_Short_Integer, Long_Long_Integer и т.д. Разные предопределённые целочисленные типы могут иметь одинаковый базовый диапазон. Однако диапазон Integer должен быть не шире, чем диапазон Long_Integer. Аналогично, диапазон Short_Integer (если предоставлен) должен быть не шире, чем Integer. Соответствующие рекомендации применяются ко всем другим предопределённым целочисленным типам. Не обязательно, чтобы для каждого отдельного базового диапазона, поддерживаемого реализацией, существовал именованный целочисленный тип. Диапазон каждого первого подтипа должен быть базовым диапазоном его типа.
Реализация может предоставить нестандартные целочисленные типы, потомки root_integer, которые объявлены вне спецификации пакета Standard, которые не должны иметь всех стандартных характеристик типа, определённого integer_type_definition. Например, нестандартный целочисленный тип может иметь асимметричный базовый диапазон или не может быть разрешён в качестве индекса массива или цикла (очень большое целое число). Любой тип, выведенный из нестандартного целочисленного типа, также является нестандартным. Реализация может вводить произвольные ограничения на использование таких типов; определяется ли реализацией, определены ли операторы, которые предопределены для «любого целочисленного типа», для конкретного нестандартного целочисленного типа. В любом случае такие типы не допускаются в качестве explicit_generic_actual_parameter для формальных скалярных типов — см. 12.5.2.
Для машины с одноимпульсным дополнением верхняя граница базового диапазона модулярного типа, чей модуль на единицу меньше степени двойки, может быть равна модулю, а не на единицу меньше модуля. Определяется реализацией, для каких степеней двойки, если таковые имеются, это разрешение применяется.
Для машины с одноимпульсным дополнением реализации могут поддерживать значения модулей, не являющиеся степенями двойки, большие, чем System.Max_Nonbinary_Modulus. Определяется реализацией, какие конкретные значения, большие, чем System.Max_Nonbinary_Modulus, если таковые имеются, поддерживаются.
Рекомендации для реализации
Реализация должна поддерживать Long_Integer в дополнение к Integer, если целевая машина поддерживает 32-разрядную (или более длинную) арифметику. Другие именованные подтипы целых чисел для пакета Standard не рекомендуются. Вместо этого соответствующие именованные подтипы целых чисел должны быть предоставлены в библиотечном пакете Interfaces (см. B.2).
Реализация для машины с двухдополнительным представлением должна поддерживать модулярные типы с двоичным модулем до System.Max_Int*2+2. Реализация должна поддерживать модули, не являющиеся степенями двойки, до Integer'Last.
ПРИМЕЧАНИЯ
25 Целочисленные литералы имеют анонимный предопределённый целочисленный тип universal_integer. Другие целочисленные типы не имеют литералов. Однако правила разрешения перегрузки (см. 8.6, «Контекст разрешения перегрузки'') позволяют использовать выражения типа universal_integer, когда ожидается целочисленный тип.
26 Те же арифметические операторы предопределены для всех знаковых целочисленных типов, определённых signed_integer_type_definition (см. 4.5, «Операторы и вычисление выражений''). Для модулярных типов эти же операторы предопределены, плюс побитовые логические операторы (and, or, xor и not). Кроме того, для беззнаковых типов, объявленных в определённом языком пакете Interfaces (см. B.2), определены функции, которые обеспечивают побитовое сдвиг и циклический сдвиг.
27 Модульных типов соответствуют generic_formal_parameter_declaration вида "тип T мод <>;"; типы целых со знаком соответствуют "тип T диапазон <>;" (см. 12.5.2).
Примеры
Примеры типов целых чисел и подтипов:
type Page_Num is диапазон 1 .. 2_000;
type Line_Size is диапазон 1 .. Max_Line_Size;
type Line_Size is диапазон 1 .. Max_Line_Size;
subtype Small_Int is Integer диапазон -10 .. 10;
subtype Column_Ptr is Line_Size диапазон 1 .. 10;
subtype Buffer_Size is Integer диапазон 0 .. Max;
subtype Column_Ptr is Line_Size диапазон 1 .. 10;
subtype Buffer_Size is Integer диапазон 0 .. Max;
type Byte is мод 256; -- беззнаковый байт
type Hash_Index is мод 97; -- модуль является простым числом
type Hash_Index is мод 97; -- модуль является простым числом