文章目录
Solidity 是一种静态类型语言,这意味着每个变量(无论是状态变量还是局部变量)都需要在声明时指定类型。Solidity 提供了多种基本类型,这些类型可以组合成复杂的数据类型。
此外,不同类型可以在包含运算符的表达式中相互作用,并且运算符具有优先级区分。
Solidity 没有“未定义”或“空”值的概念,但新声明的变量总会有默认值,且默认值取决于其类型。如果遇到意外的值,应使用 revert 函数回滚交易,或者返回一个布尔值的元组,其中第二个 bool 值表示操作是否成功。
值类型
值类型的变量总是按值传递,即在作为函数参数或赋值时会被复制。
与引用类型不同,值类型的声明不指定数据存储位置,因为它们足够小,可以存储在栈中。唯一的例外是状态变量,状态变量默认存储在存储区,但也可以标记为 transient、constant 或 immutable。
布尔值
bool:值只能是 true 或 false。
整数
int / uint:有符号和无符号整数,支持不同大小。
关键字 uint8 到 uint256(以 8 为步长,表示 8 位到 256 位的无符号整数),以及 int8 到 int256。
uint 和 int 分别是 uint256 和 int256 的别名。
运算符
比较运算符:<=,<,==,!=,>=,>(结果为布尔值)
位运算符:&,|,^(按位异或),~(按位取反)
移位运算符:<<(左移),>>(右移)
算术运算符:+,-,一元 -(仅适用于有符号整数),*,/,%(取模),**(指数运算)
对于整数类型 X,可以使用 type(X).min 和 type(X).max 获取该类型的最小值和最大值。
运算符 || 和 && 遵循短路规则。例如,在 f(x) || g(y) 表达式中,如果 f(x) 结果为 true,则 g(y) 不会被计算。
注意
Solidity 中的整数有大小限制。例如,对于 uint32,其范围是 0 到 2**32 - 1。
Solidity 中的整数运算有两种模式:“溢出”模式(wrapping/unchecked mode)和 “检查”模式(checked mode)。
-
默认情况下,运算在检查模式下进行。如果运算结果超出了类型的范围,则会因失败的断言而回滚。
-
可以使用 unchecked { … } 切换到溢出模式,但应谨慎使用。
取模运算
取模运算符 % 返回操作数 a 除以 n 后的余数 r,