Ethereum-Solidity 测验 Q29:什么是溢出/下溢?
发布: (2026年2月8日 GMT+8 01:41)
2 分钟阅读
原文: Dev.to
Source: Dev.to
溢出与下溢
溢出和下溢是当计算产生的数超出变量数据类型固定范围时出现的算术错误。
| 术语 | 会发生什么 | 示例(uint8:范围 0–255) |
|---|---|---|
| 溢出 | 超过最大值,数字“回绕”到最底部。 | 255 + 1 --> 0 |
| 下溢 | 低于最小值,数字“跳转”到最高位。 | 0 - 1 --> 255 |
Solidity 0.8.0 之前的版本
在 0.8.0 之前,Solidity 不会检查这些错误。开发者必须依赖诸如 SafeMath 的库来防止溢出和下溢。
Solidity 0.8.0 及以后
从 Solidity 0.8.0 开始,编译器内置了检查。如果发生溢出或下溢,交易会自动因 Panic 错误而回滚。
unchecked 块
当你确信计算是安全的且想通过跳过检查来节省 gas 时,可以将代码包裹在 unchecked 块中:
// This will NOT revert; it will wrap around to 0
unchecked {
uint8 x = 255;
x++;
}
类型转换注意事项
即使在 Solidity 0.8.0+,将较大类型转换为较小类型(例如 uint256 → uint8)仍可能在不回滚的情况下产生静默回绕。进行类型转换前,请始终确认该值在目标类型的范围内。
推荐:使用 uint256
除非有特定原因(例如将数据装入单个 32 字节存储槽),否则建议使用 uint256。其巨大的范围(2^256 - 1)使得在典型的金融应用中几乎不可能出现溢出。