Axiom Справочник языка

Глава 3 · Выражения и операции

Преобразования типов

Значение одного типа нередко нужно представить в другом: целое записать в переменную LONG, дробное — в DECIMAL, текст — превратить в число. Часть таких переходов выполняется автоматически при присваивании или передаче аргумента, для остальных нужен вызов функции. Допустимость перехода и сохранение точности при этом являются разными свойствами.

Вывод типа и преобразование

При выводе типа компилятор выбирает тип новой переменной по начальному выражению: DIM count = 3 объявляет INTEGER. При преобразовании тип исходного значения уже известен, поэтому запись этого числа в переменную LONG представляет его как LONG. Формы объявления находятся в статье DIM, типы литералов и их пределы — в таблице диапазонов.

Автоматические числовые переходы

Для уже типизированных числовых значений разрешены следующие переходы:

Исходный типЦелевые типы
INTEGERLONG, DOUBLE, DECIMAL
LONGDOUBLE, DECIMAL
DECIMALDOUBLE

Переход в DOUBLE может округлить исходное значение, а обратный переход, например из переменной LONG в INTEGER или из DOUBLE в DECIMAL, автоматически не выполняется: для него нужна предусмотренная функция преобразования.

DIM count AS INTEGER = 3
DIM wide AS LONG = count
DIM exact AS DECIMAL = wide
DIM approximate AS DOUBLE = exact
PRINT count, wide, exact, approximate

Результат:

3 3 3 3

Обычная арифметика также приводит совместимые операнды к общему типу: если участвует DOUBLE, DECIMAL преобразуется в DOUBLE. Функции MIN, MAX и CLAMP имеют более строгий договор и отклоняют сочетание DECIMAL и DOUBLE в аргументах. Тип результата деления и общая последовательность числового продвижения описаны в статье операций.

Литерал в ожидаемом числовом типе

Непосредственный числовой литерал в объявлении, присваивании или аргументе проверяется с учётом ожидаемого типа; так же обрабатывается минус непосредственно перед литералом. Литерал с десятичной точкой, помещённый в DECIMAL, читается как десятичное число без промежуточного значения DOUBLE:

DIM amount AS DECIMAL = 10.50
DIM extra AS DECIMAL = 0.20
PRINT amount + extra

Результат:

10.70

Ожидаемый тип не распространяется внутрь произвольного выражения, и скобки вокруг литерала не сохраняют этот особый способ чтения: DIM amount AS DECIMAL = (10.50) получает выражение DOUBLE и отклоняется с MB2003. Тот же результат даёт DIM amount AS DECIMAL = 10.50 + 0.20, поскольку сложение сначала связывается как DOUBLE.

У сохранённой переменной тип уже известен, поэтому преобразовать переменную DOUBLE в DECIMAL автоматически нельзя — применяется обычный договор переходов.

Функции преобразования

CINT, CLNG, CDBL и CDEC выполняют явные числовые преобразования, VAL разбирает числовой текст, STR получает текстовое представление числа. Типы аргументов, усечение, пределы и поведение при неверном тексте определяются договором каждой функции; полные формы находятся в главе преобразования чисел и текста.

DIM raw AS DOUBLE = -3.75
PRINT CINT(raw)
PRINT CLNG(raw)
PRINT VAL("12.5")
PRINT STR(12)

Результат:

-3
-3
12.5
12

В этом примере CINT и CLNG отбрасывают дробную часть к нулю; это правило не заменяет проверку диапазона результата.

Логические, строковые и составные значения

BOOLEAN не преобразуется в число ни автоматически, ни функциями CINT, CLNG, CDBL и CDEC, а встроенной CBOOL нет. Число проверяется сравнением, для выбора числового результата по BOOLEAN используется IF; примеры приведены в разделе преобразований логических значений.

Строка и число не складываются через +: для получения строки служит явное преобразование, а операция & отдельно определяет, какие значения она переводит в текст.

Временные типы имеют собственные переходы и правила разбора канонических строк; в частности, неявное отбрасывание части DATETIME при записи в DATE или TIME запрещено. Полный договор, включая отдельный тип момента UTCDATETIME, находится в главе даты и времени.

FILE, массивы, пользовательские записи и функциональные значения в общих скалярных преобразованиях не участвуют; их совместимость и способы передачи описываются на страницах соответствующих типов.

Диагностика

  • MB2003: несовместимые типы, в том числе недопустимый автоматический переход, сложение строки с числом либо смешение DECIMAL и DOUBLE в MIN, MAX или CLAMP.
  • MB2018: непосредственный числовой литерал нельзя прочитать в ожидаемом типе из-за записи или диапазона. Например, DIM n AS INTEGER = 1.0 отклоняется этим кодом, хотя величина 1 помещается в INTEGER: дробная запись не является целочисленной.
  • MB3008: числовое переполнение или неконечный результат во время выполнения.

Функции разбора и преобразования могут выдавать дополнительные диагностики по собственным правилам; они перечислены на страницах функций.

Запускаемые примеры

Откройте нужный файл в IDE и запустите его. Примеры с ошибкой предназначены для проверки сообщения компилятора или выполнения.

См. также