有理数和整数字面量
整数文字由 0-9 范围内的数字序列组成。它们被解释为小数。例如,69表示六十九。Solidity 中不存在八进制文字,前导零无效。
十进制小数文字由.一侧至少有一个数字的 a 组成。示例包括1.和。.11.3
还支持以 的形式的科学记数法2e10,其中尾数可以是小数,但指数必须是整数。字面MeE量等价于。示例包括, , , 。M * 10**E2e10-2e102e-102.5e1
下划线可用于分隔数字文字的数字以提高可读性。例如,十进制123_000、十六进制0x2eff_abde、科学十进制记数法1_2e345_678都是有效的。下划线只允许在两位数之间,并且只允许一个连续的下划线。包含下划线的数字文字没有添加额外的语义含义,下划线被忽略。
数字文字表达式保持任意精度,直到它们被转换为非文字类型(即通过将它们与数字文字表达式(如布尔文字)以外的任何内容一起使用或通过显式转换)。这意味着计算不会溢出,除法不会在数字文字表达式中截断。
例如,虽然中间结果甚至不适合机器字长,但结果为常量(类型为)。此外,结果为整数(尽管在两者之间使用了非整数)。(2**800 + 1) - 2**8001uint8.5 * 84
警告
虽然大多数运算符在应用于文字时都会产生文字表达式,但有些运算符不遵循此模式:
- 三元运算符 ( ),... ? ... : ...
- 数组下标 ( <array>[<index>])。
您可能希望表达式或等价于直接使用文字 256,但实际上它们是在类型内计算的并且可能溢出。255 + (true ? 1 : 0)255 + [1, 2, 3][0]uint8
只要操作数是整数,任何可以应用于整数的运算符也可以应用于数字文字表达式。如果两者中的任何一个是小数,则不允许位运算,并且如果指数是小数,则不允许取幂(因为这可能导致非有理数)。
将文字数字作为左(或基)操作数和整数类型作为右(指数)操作数的移位和取幂总是在uint256(对于非负文字)或int256(对于负文字)类型中执行,无论右(指数)操作数。
警告
在 Solidity 0.4.0 之前的版本中,整数文字的除法用于截断,但现在它转换为有理数,即不等于,而是等于。5 / 222.5
笔记
Solidity 对每个有理数都有一个数字文字类型。整数文字和有理数文字属于数字文字类型。此外,所有数字文字表达式(即仅包含数字文字和运算符的表达式)都属于数字文字类型。所以数字文字表达式和都属于有理数三的相同数字文字类型。1 + 22 + 1
笔记
数字文字表达式在与非文字表达式一起使用时立即转换为非文字类型。不考虑类型,分配给b 下面的表达式的值计算为整数。不过,因为ais 属于 type uint128,所以表达式必须具有正确的类型。由于and的类型没有通用类型,Solidity 编译器不接受此代码。2.5 + a2.5uint128
uint128 a = 1; uint128 b = 2.5 + a + 0.5;