Uint256 最大值

本文深入探讨了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 的大小,例如 uint128uint32(甚至不常用但有效的大小,如 uint208)。一个 uintN 意味着有 N 位表示数字,当所有位都设置为1时,这就是最大二进制表示。EVM 使用 Twos Complement 来表示有符号数,所以获得有符号整数最大值的公式是 $2^{n-1} – 1$,最小负值是 $-2 ^ {n – 1}$。

获取 uint256 最大值的巧妙方法

你也可以通过十六进制来指定它,这比使用十进制表示更简洁,但仍然占空间且容易出错。

Uint256 最大值的十六进制表示

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”,则编译器识别算术的结果是有效的。

uint256(-1) 不再有效

在旧版本的 Solidity 中,可以使用 uint256(-1) 来检索最大值,但现在不再可以编译。最好避免所有这些繁琐操作,直接使用 type(uint256).max

2^256 – 1 到底有多大?

为了给这个数字提供一些背景,已知宇宙中的原子估计数量大约为 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/