Содержание

Рациональные и целые литералы в Solidity

Целочисленные литералы формируются последовательностью цифр от 0 до 9. Они интерпретируются как десятичные. Восьмеричных литералов в Solidity нет, и ведущие нули недействительны.

Литералы десятичной дроби формируются с помощью точки, с минимум одной цифрой с одной стороны. Например, 1., .1 и 1.3.

Научная запись числа также поддерживается. Основа может иметь дроби, а экспонента — нет. Например, 2e10, -2e10, 2e-10, 2.5e1.

Числовые литералы содержат произвольную точность до тех пор, пока они не будут преобразованы в нелитеральный тип (используя их вместе с нелитеральным выражением). Это означает, что вычисления не переполняются, а деления не обрезаются в числовых литералах.

Например, (2 ** 800 + 1) – 2 ** 800 приводит к константе 1 (типа uint8), хотя промежуточные результаты не будут соответствовать размеру машинного слова. Кроме того, .5 * 8 приводит к целому числу 4 (хотя здесь использовалось нецелое число).

Любой оператор, который может быть применен к целым числам, также может применяться к числовым литералам, если операнды являются целыми числами. Если какой-либо из 2 операндов дробный, то битовые операции запрещены. Также, запрещено возведение в степень, если показатель степень дробный (так как это может привести к нерациональному числу).

Примечание

Solidity имеет числовой тип для каждого рационального числа. Целочисленные литералы и литералы рационального числа относятся к числовым типам. Более того, все выражения с числовыми литералами (т.е. выражения, которые содержат только числовые литералы и операторы) относятся к числовым типам. Таким образом оба выражения 1 + 2 и 2 + 1 принадлежат к одному типу литерала для рационального числа 3.

Предупреждение

Результат деления на целочисленный литерал усекался в ранних версиях, а сейчас он преобразуется в рациональное число. Например, 5 / 2 равно не 2, а 2.5.

Примечание

Числовые литералы в выражениях преобразуются в нелитеральные типы, как только они используются в нелитеральных выражениях. В следующем пример, несмотря на то, что известно, что значение b является целым числом, код не скомпилируется, так как выражение 2.5 + a не проходит проверку типа.

uint128 a = 1;
uint128 b = 2.5 + a + 0.5;
Материал был полезен? Поделитесь в соц. сетях:
Логотип echain.ru

Добавить комментарий

Ваш e-mail не будет опубликован.