文章目录
字面量和基础类型之间的转换
整数类型
十进制和十六进制数字面量可以隐式转换为任何足够大的整数类型,以便表示它们而不会发生截断:
uint8 a = 12; // 合法
uint32 b = 1234; // 合法
uint16 c = 0x123456; // 不合法,因为它会被截断为 0x3456
注意:在 0.8.0 版本之前,所有的十进制或十六进制数字面量都可以显式转换为整数类型。从 0.8.0 开始,显式转换的规则与隐式转换一样严格,即只有当字面量的值适合目标类型的范围时,才允许转换。
固定大小字节数组
十进制数字面量不能隐式转换为固定大小字节数组。十六进制数字面量可以隐式转换,但前提是十六进制数字的数量恰好符合字节类型的大小。作为例外,值为零的十进制和十六进制字面量可以转换为任何固定大小的字节类型:
bytes2 a = 54321; // 不允许
bytes2 b = 0x12; // 不允许
bytes2 c = 0x123; // 不允许
bytes2 d = 0x1234; // 合法
bytes2 e = 0x0012; // 合法
bytes4 f = 0; // 合法
bytes4 g = 0x0; // 合法
字符串字面量和十六进制字符串字面量可以隐式转换为固定大小字节数组,如果它们的字符数不超过字节类型的大小:
bytes2 a = hex"1234"; // 合法
bytes2 b = "xy"; // 合法
bytes2 c = hex"12"; // 合法
bytes2 e = "x"; // 合法
bytes2 f = "xyz"; // 不允许
地址类型
如在地址字面量中所述,符合大小且通过校验和测试的十六进制字面量属于地址类型。其他任何字面量都不能隐式转换为地址类型。
显式转换为地址类型只允许从 bytes20
和 uint160
类型进行。
此外,可以通过 payable(a)
将地址 a
显式转换为可支付地址(address payable
)。
注意:在 0.8.0 版本之前,可以将任何整数类型(无论大小或符号)显式转换为地址或可支付地址。从 0.8.0 开始,仅允许从 uint160
类型转换。