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

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, преобразованными к определяемoму типу.
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.
ПРИМЕЧАНИЕ 1 Целочисленные литералы относятся к анонимному предопределённому целому типу universal_integer. Другие целочисленные типы не имеют литералов. Однако правила разрешения перегрузки (см. 8.6, «Контекст разрешения перегрузки») допускают выражения типа universal_integer, когда ожидается целочисленный тип.
ПРИМЕЧАНИЕ 2 Одинаковые арифметические операторы определены для всех знаковых целочисленных типов, определённых signed_integer_type_definition (см. 4.5, «Операторы и оценка выражений»). Для модульных типов эти же операторы определены, плюс побитовые логические операторы (and, or, xor, и not). Кроме того, для беззнаковых типов, объявленных в пакете языка Interfaces (см. B.2), определены функции, предоставляющие побитовые сдвиги и вращения.
ПРИМЕЧАНИЕ 3 Модульные типы соответствуют 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