Solidity 算术

本文详细介绍了 Solidity 中的算术运算,包括加法、减法、乘法和除法等基本操作,并阐述了 Solidity 不支持浮点数的原因以及溢出和下溢的处理方式。此外,文章还介绍了如何使用未检查块来允许这些操作,适合希望深入理解 Solidity 算术运算的开发者。

算术在 Solidity 中的行为与其他语言完全相同,因此我们在这里不会过多赘述。

你可以这样相加数字


uint256 sum = 10 + 5; // sum == 15

uint256 x = 1;
uint256 y = 2;

uint256 anotherSum = x + y; // anotherSum == 3

指数运算与其他 C 类语言相同。


uint256 exp = 2 ** 3; // exp == 8

取模运算也是如此


uint256 remainder = 10 % 4; // remainder == 2

减法、乘法和除法是显而易见的,因此我不会侮辱你的智商,教你如何做这些。

Solidity 不支持浮点数

如果你尝试将 5 除以 2,你不会得到 2.5。你将得到 2。请记住,uint256 是无符号整数。因此,你所做的任何除法都是整数除法。

但如果你真的想知道 200 的 10% 是多少呢?这对计算利息来说似乎是非常合理的。


uint256 interest = 200 * 0.1; // 失败,0.1 无效

解决此问题的方法是将 x 0.1 转换为 x 1 / 10。这是有效的,并将产生正确的答案。


uint256 interest = 200 / 10;

如果你的利息是 7.5% 这样的数额,那么你需要做以下操作


uint256 interest = 200 * 75 / 1000;

如果你想知道一个城市与一个国家的相对人口百分比,你不能这样做。


uint256 cityPopulation = 1000;
uint256 nationPopulation = 10000;

uint256 fractionOfPopulation = cityPopulation / nationPopulation;
//fractionOfPopulation 为零!

这需要一个更复杂的解决方案,我们将稍后描述。

注意: 为什么 Solidity 不支持浮点数?浮点数并不总是确定的,而区块链必须是确定的,否则节点不会就交易结果达成一致。例如,如果你把 2/3 除,一些计算机会返回 0.6666,而其他则返回 0.66667。这个不一致可能导致区块链网络分裂!因此,Solidity 不允许使用浮点数。

Solidity 不会出现下溢或上溢,它会停止执行

如果你尝试做以下操作,会发生什么?


function subtract(uint256 x, uint256 y)
        public
        pure
        returns (uint256) {
            uint256 difference = x - y;
            return difference;
}

如果 x 是 2 而 y 是 5,会发生什么?你不会得到负 3。实际上,发生的情况是执行将停止并产生 revert

Solidity 不会抛出异常,但你可以将 revert 视为其他语言中未捕获异常或恐慌的等价物。

以前,Solidity 允许上溢和下溢,但这导致了足够多的智能合约崩溃或被黑客攻击,因此该语言在语言中内置了上溢和下溢保护。这一特性是在 Solidity 0.8.0 版本之后添加的。

你可能现在已经注意到,许多 Solidity 文件都有一行

**pragma solidity ^0.8.0;**

这意味着源代码是以 0.8.0 或更高版本编译的。如果你看到早于该版本的版本,则不能假设代码内置了上溢保护。

如果你想允许下溢和上溢,你需要使用未检查的块

你可以使用未检查的块来允许下溢和上溢。除非你有非常充分的理由这样做,否则不推荐这样使用。未检查的块可以这样使用:


uint256 x = 1;
uint256 y = 2;

unchecked {
    uint256 z = x - y; // z == 2**256 - 1
}

请注意,在未检查的块中的任何内容即使在上溢或下溢时也不会 revert。这是一项非常高级的功能,除非你知道自己在做什么,否则不应使用。

练习题

加法

除法

指数

未检查

深入了解更多

查看 区块链训练营 ,以了解更多关于智能合约开发和代币标准的内容。

  • 原文链接: rareskills.io/learn-soli...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

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