在编译时上下文中内置的值类型转换
作者: cameel创建于 2026年1月26日更新于 2026年9月9日
标签medium effortmedium impactshould have
□ 摘要 在计算上下文中执行数值类型之间的明确类型转换。 这可以分阶段进行:
- (1) 改为`int'
- (2) 任何整数类型之间的转换
- (3) 整数、固定字节和地址之间的所有转换
注:对用户定义值类型的支持(合同,enums,UDVTs)不属于本问题的范围. 也省去 " bool " 也很好,因为不允许从布尔人转换成其他类型,并且不允许在计算时使用北方操作人。
□动机 目前类型转换只允许在运行时上下文中进行,即使该参数是一个编译时常数,如字面. 在计算上下文(阵列大小,布局基础表达式)中,它们会导致出错.
我们已经通过常数支持在计算上下文中的有限精度算术(有溢出/漏出报告为汇编错误),因此在组合中添加类型转换应该相对偏差,不需要完全执行#3157.
初步实施的目标是支持将keccak256()'产生的 " 字节32 " 值转换为int " 值,为此第一阶段就够了。
□ 规格
- 第一阶段:在计算时评价明确的`int()'转换。
- 第2阶段:评价明确的
int()'、int8()'.int248()'、int8()'.`int248()'在计算上转换。 - 第3阶段:评价明确的
字节1()'.字节32()'、地址()'、应付款()'在计算时转换。
转换应产生有限的精度值,就像目前常数一样. 计算中的流出/流出应导致编译时间出错. 请注意,这一点 * 不是受到 " 未检查 " 区块的影响,因为目前这些区块从未影响计算上下文。
这一变化不应影响运行时间背景。 在基站布局规格或阵列尺寸之外,明确转换仍应在运行时间进行评估. 特别是溢出/溢出仍应是运行时间检查。
□ 实例
- 第一阶段
- 从字面上改为 " int " : 团结 合同 C 版式为 uint( 123) + 456 + QQ 合同C版式为: (0x11111112222222333333344444444) 合同 C 版式为 uint( 2** 256) {} // 编译错误 合同 C 的布局, 以 uint( 1) // 编译错误
- 从编译时间转换返回“字节32”:
团结
合同 C 的布局( keccak256 ("abc")) + 10 + QQ- 注:这只能与 #16421合并使用。
- 从不断初始化并带有计算表达式的转换: 团结 字节32常数 X = hex"12345678"; 2. 字节32常数 Y = Q; . . . . . . . . 合同 C 的布局在 uint( Y) {}
- 常数内转换:
团结
uint常数 X = uint(123);
. . . . . . . .
X 的 C 合同版式- 以无限精度值计算的过度流量: 团结 合同C版式为2**255 * 2 {} . . . . . . .
内容来源: argotorg/solidity