【区块链安全 | 第二十二篇】类型之字面量和基础类型之间的转换

在这里插入图片描述

字面量和基础类型之间的转换

整数类型

十进制和十六进制字面量可以隐式转换为任何足够大的整数类型,只要它们的值不会在转换过程中发生截断:

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 类型进行此类转换。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值