本文详细介绍了 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!