本文深入探讨了Solidity中的uint256最大值的获取方式,包括使用内置类型、数学公式和一些不推荐的hack方法。作者指出,使用type(uint256).max
是最干净且安全的做法,并对最大值的大小进行透彻的解释和可视化。具有明确的逻辑和结构,适合Solidity开发者阅读。
markdown
uint256 的最大值可以通过 type(uint256).max;
获得,值为
115792089237316195423570985008687907853269984665640564039457584007913129639935
或 2²⁵⁶-1。但使用 type(uint256).max
更清晰和安全。对于有符号整数类型也可以使用相同的方法。
// 57896044618658097711785492504343953926634992332820282019728792003956564819967
type(int256).max;
// -57896044618658097711785492504343953926634992332820282019728792003956564819968
type(int256).min;
对于无符号整数,只需在你喜欢的解释型语言的终端中输入 2 ** n - 1
即可获得答案,其中 n
是相关 uint 的大小,例如 uint128
或 uint32
(甚至不常用但有效的大小,如 uint208
)。一个 uintN 意味着有 N
位表示数字,当所有位都设置为1时,这就是最大二进制表示。EVM 使用 Twos Complement 来表示有符号数,所以获得有符号整数最大值的公式是 $2^{n-1} – 1$,最小负值是 $-2 ^ {n – 1}$。
你也可以通过十六进制来指定它,这比使用十进制表示更简洁,但仍然占空间且容易出错。
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
这正好是 64 个 ‘f’,可千万不要搞错!64 是从 256 位除以 8 得到的字节数(32),每个最大字节在十六进制中用 0xff 表示。
~uint256(0)
等同于 uint256 最大值uint256 的最大值是 256 位全设为1。那么怎么用位翻转运算符呢?(~
)
type(uint256).max == ~uint256(0) // 这将返回 true
另一个不优雅的解决方案是让整数发生下溢。
function maximum() public pure returns(uint256) {
unchecked { return uint256(0) - uint256(1); }
}
以下代码正常工作,但具有误导性,不推荐使用。
function maxUint() public pure returns (uint256) {
return 2**256 - 1;
}
它返回正确的值,你可以用以下代码验证:
assert(2**256 - 1 == type(uint256).max);
如果你将 2**256
写为常量在 Solidity 中,代码将无法编译,因为编译器识别 2**256
太大而无法适应 uint256。但如果它后面紧跟着一个 “- 1”,则编译器识别算术的结果是有效的。
在旧版本的 Solidity 中,可以使用 uint256(-1)
来检索最大值,但现在不再可以编译。最好避免所有这些繁琐操作,直接使用 type(uint256).max
;
为了给这个数字提供一些背景,已知宇宙中的原子估计数量大约为 10^80。为了可视化它,let's 将这些数字并排放置:
115792089237316195423570985008687907853269984665640564039457584007913129639935
100000000000000000000000000000000000000000000000000000000000000000000000000000000
这大约意味着 1,000 个 uint256 变量可以枚举已知宇宙中的每个原子。由于大多数“感兴趣”的物体由超过 1,000 个原子组成,因此单个 uint256 可以枚举任何有用的对象集合,并且有足够的空间。此外,随机选择的两个 uint256 值(相当于 keccak256 哈希的输出)在所有实际情况下不会发生碰撞。
如果你是 Solidity 新手,请查看我们的 learn solidity free for beginner course。对于中级和高级开发人员,请参见我们的专家课程 solidity bootcamp。最初发布于 2023 年 4 月 2 日
- 原文链接: rareskills.io/post/uint-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!