文章目录
值类型
有理数和整数字面量(Rational and Integer Literals)
整数字面量由一串数字(范围为 0-9)组成,按十进制解析。例如,69 代表六十九。Solidity 中没有八进制字面量,且前导零是无效的。
十进制小数字面量由一个小数点(.
)和至少一个小数点后的数字组成。例如,.1
和 1.3
是有效的(但 1.
是无效的)。
科学记数法格式(如 2e10
)也被支持,其中尾数(mantissa)可以是小数,但指数必须是整数。字面量 MeE
等价于 M * 10**E
。例如,2e10
、-2e10
、2e-10
和 2.5e1
都是有效的。
可以使用下划线分隔数字字面量中的数字,以提高可读性。例如,十进制的 123_000
、十六进制的 0x2eff_abde
、科学记数法表示的 1_2e345_678
都是有效的。下划线只能放在两个数字之间,并且只允许使用一个连续的下划线。数字字面量中的下划线不会增加额外的语义意义,下划线会被忽略。
数字字面量表达式保留任意精度,直到它们被转换为非字面量类型(即,与其他非数字字面量表达式一起使用,或者通过显式转换)。这意味着数字字面量表达式中的计算不会溢出,除法操作不会截断。
例如, (2**800 + 1) - 2**800
结果为常量 1
(类型为 uint8
),尽管中间结果甚至无法容纳在机器字长中。此外, .5 * 8
结果为整数 4
(尽管中间使用了非整数)。
注意
尽管大多数运算符应用于字面量时会产生字面量表达式,但有些运算符并不遵循这一模式:
- 三元操作符(
... ? ... : ...
) - 数组下标(
<array>[<index>]
)
例如,你可能会期望像 255 + (true ? 1 : 0)
或 255 + [1, 2, 3][0]
这样的表达式等价于直接使用字面量 256
,但实际上它们在类型 uint8
内计算,可能会发生溢出。
任何可以应用于整数的运算符也可以应用于数字字面量表达式,只要操作数是整数。如果其中任何一个是小数,则不允许使用位运算,并且如果指数是小数,则不允许使用指数运算(因为这可能导致非有理数)。
对于字面量数字作为左操作数(或基数)和整数类型作为右操作数(指数)的移位和指数运算,总是使用 uint256
(对于非负字面量)或 int256