阅读(4112)
赞(13)
字面量和基本类型之间的转换
2022-05-12 10:25:41 更新
整数类型
十进制和十六进制数字文字可以隐式转换为任何足够大的整数类型,无需截断即可表示:
uint8 a = 12; // fine uint32 b = 1234; // fine uint16 c = 0x123456; // fails, since it would have to truncate to 0x3456
笔记
在 0.8.0 版本之前,任何十进制或十六进制数字文字都可以显式转换为整数类型。从 0.8.0 开始,此类显式转换与隐式转换一样严格,即,仅当文字符合结果范围时才允许它们。
固定大小的字节数组
十进制数字文字不能隐式转换为固定大小的字节数组。十六进制数字文字可以,但前提是十六进制数字的数量完全适合字节类型的大小。作为一个例外,具有零值的十进制和十六进制文字都可以转换为任何固定大小的字节类型:
bytes2 a = 54321; // not allowed bytes2 b = 0x12; // not allowed bytes2 c = 0x123; // not allowed bytes2 d = 0x1234; // fine bytes2 e = 0x0012; // fine bytes4 f = 0; // fine bytes4 g = 0x0; // fine
字符串文字和十六进制字符串文字可以隐式转换为固定大小的字节数组,如果它们的字符数与字节类型的大小匹配:
bytes2 a = hex"1234"; // fine bytes2 b = "xy"; // fine bytes2 c = hex"12"; // not allowed bytes2 d = hex"123"; // not allowed bytes2 e = "x"; // not allowed bytes2 f = "xyz"; // not allowed
地址
如地址文字中所述,通过校验和测试的正确大小的十六进制文字属于address
类型。没有其他文字可以隐式转换为该address
类型。
从bytes20
或任何整数类型的显式转换address
导致.address payable
可以转换为via 。address a
address payable
payable(a)