Spec-Zone.ru › Ada 2012
Справочник по Ada 2012

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, если это степень 2, или не должно быть больше 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;
Тип, определенный с помощью 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'Mod
S'Mod обозначает функцию со следующим описанием:
function S'Mod (Arg : universal_integer)
return S'Base
Эта функция возвращает Arg mod S'Modulus как значение типа 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.
Для машины с однодополнительным кодированием верхняя граница базового диапазона модулярного типа, чей модуль на единицу меньше степени 2, может быть равна модулю, а не на единицу меньше модуля. Для каких степеней 2, если таковые имеются, это разрешение применяется, определено реализацией.
Для машины с однодополнительным кодированием реализации могут поддерживать значения не двоичного модуля, большие, чем System.Max_Nonbinary_Modulus. Для каких конкретных значений, больших, чем System.Max_Nonbinary_Modulus, если таковые имеются, поддерживаются, определено реализацией.

Рекомендации по реализации

Реализация должна поддерживать Long_Integer в дополнение к Integer, если целевая машина поддерживает 32-битное (или большее) арифметическое. Другие именованные целочисленные подтипы для пакета Standard не рекомендуются. Вместо этого соответствующие именованные целочисленные подтипы должны предоставляться в библиотечном пакете Interfaces (см. B.2).
Реализация для машины с двоично-дополнительным кодированием должна поддерживать модулярные типы с двоичным модулем до System.Max_Int*2+2. Реализация должна поддерживать не двоичный модуль до Integer'Last.
ПРИМЕЧАНИЯ
33 Целочисленные литералы являются анонимного предопределённого целочисленного типа universal_integer. Другие целочисленные типы не имеют литералов. Однако, правила разрешения перегрузки (см. 8.6, «Контекст разрешения перегрузки») позволяют использовать выражения типа universal_integer, когда ожидается целочисленный тип.
34 Те же арифметические операторы определены для всех знаковых целочисленных типов, определённых с помощью signed_integer_type_definition (см. 4.5, «Операторы и вычисление выражений»). Для модульных типов эти же операторы определены, плюс побитовые логические операторы (and, or, xor и not). Кроме того, для беззнаковых типов, объявленных в пакете интерфейсов, определённом языком (см. B.2), определены функции для побитового сдвига и циклического сдвига.
35 Модульные типы соответствуют generic_formal_parameter_declaration вида "type T is mod <>;"; знаковые целочисленные типы соответствуют "type T is range <>;" (см. 12.5.2).

Примеры

Примеры целочисленных типов и подтипов:
type Page_Num is range 1 .. 2_000;
type Line_Size is range 1 .. Max_Line_Size;
subtype Small_Int is Integer range -10 .. 10;
subtype Column_Ptr is Line_Size range 1 .. 10;
subtype Buffer_Size is Integer range 0 .. Max;
type Byte is mod 256; -- беззнаковый байт
type Hash_Index is mod 97; -- модуль является простым числом


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API