
字面量和基础类型之间的转换
整数类型
十进制和十六进制字面量可以隐式转换为任何足够大的整数类型,只要它们的值不会在转换过程中发生截断:
uint8 a = 12; // 合法
uint32 b = 1234; // 合法
uint16 c = 0x123456; // 不合法,因为它会被截断为 0x3456
注意:在 Solidity 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) 将普通地址显式转换为可支付地址(address payable):
address a = 0x1234...;
address payable b = payable(a);
注意:在 0.8.0 版本之前,允许将任何整数类型(无论符号或大小)显式转换为地址或可支付地址。从 0.8.0 起,仅支持从 uint160 类型进行此类转换。
6048

被折叠的 条评论
为什么被折叠?



