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

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

Правила разрешения имен

Каждое static_simple_expression в signed_integer_type_definition должно быть любого целочисленного типа; они не обязательно должны быть одного и того же типа. Выражение expression в modular_type_definition также должно быть любого целочисленного типа.

Правила легитимности

Значения static_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 определяет целочисленный тип, чей базовый диапазон включает по меньшей мере значения static_simple_expression и является симметричным относительно нуля, за исключением, возможно, дополнительного отрицательного значения. signed_integer_type_definition также определяет ограниченный первый подтип типа с диапазоном, границы которого задаются значениями static_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.
Для машины с дополнением до единицы верхняя граница базового диапазона модулярного типа, чей модуль на единицу меньше степени двойки, может быть равна модулю, а не на единицу меньше модуля. Определено реализацией, для каких степеней двойки, если таковые имеются, применяется это разрешение.
Для машины с дополнением до единицы реализации могут поддерживать значения модуля, отличные от двоичных, большие, чем System.Max_Nonbinary_Modulus. Определено реализацией, какие конкретные значения, большие, чем System.Max_Nonbinary_Modulus, если таковые имеются, поддерживаются.

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

Реализация должна поддерживать Long_Integer в дополнение к Integer, если целевая машина поддерживает 32-битный (или более) арифметический вычисления. Другие именованные целочисленные подтипы для пакета Standard не рекомендуются. Вместо этого соответствующие именованные целочисленные подтипы должны быть предоставлены в библиотечном пакете Interfaces (см. B.2).
Реализация для машины с дополнением до двух должна поддерживать модулярные типы с двоичным модулем до System.Max_Int*2+2. Реализация должна поддерживать модуль, отличный от двоичного, до Integer'Last.
ПРИМЕЧАНИЯ
27 Целочисленные литералы объёмом 27 принадлежат анонимному предопределённому целочисленному типу universal_integer. Другие целочисленные типы не имеют литералов. Однако правила разрешения перегрузки (см. 8.6, «Контекст разрешения перегрузки») позволяют использовать выражения типа universal_integer в тех местах, где ожидается целочисленный тип.
28 Те же арифметические операторы предопределены для всех целых типов со знаком, определённых signed_integer_type_definition (см. 4.5, «Операторы и оценка выражений»). Для модульных типов эти же операторы предопределены, плюс битовые логические операторы (and, or, xor, и not). Кроме того, для беззнаковых типов, объявленных в определяемом языком пакете Interfaces (см. B.2), определены функции, предоставляющие битовые сдвиги и циклические сдвиги.
29 Модульные типы соответствуют 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