算术运算符 #
一、算术运算符概述 #
Solidity支持以下算术运算符:
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
| + | 加法 | a + b | 两数相加 |
| - | 减法 | a - b | 两数相减 |
| * | 乘法 | a * b | 两数相乘 |
| / | 除法 | a / b | 两数相除 |
| % | 取余 | a % b | 取余数 |
| ** | 幂运算 | a ** b | a的b次方 |
| ++ | 自增 | a++ | a = a + 1 |
| – | 自减 | a– | a = a - 1 |
二、基本算术运算 #
2.1 加法运算 #
solidity
contract Addition {
function add(uint256 a, uint256 b) public pure returns (uint256) {
return a + b;
}
function addInt(int256 a, int256 b) public pure returns (int256) {
return a + b;
}
// 注意:Solidity 0.8.x 内置溢出检查
function safeAdd(uint8 a, uint8 b) public pure returns (uint8) {
// 如果溢出会自动revert
return a + b;
}
}
2.2 减法运算 #
solidity
contract Subtraction {
function subtract(uint256 a, uint256 b) public pure returns (uint256) {
require(a >= b, "Underflow");
return a - b;
}
function subtractInt(int256 a, int256 b) public pure returns (int256) {
return a - b;
}
}
2.3 乘法运算 #
solidity
contract Multiplication {
function multiply(uint256 a, uint256 b) public pure returns (uint256) {
return a * b;
}
}
2.4 除法运算 #
solidity
contract Division {
function divide(uint256 a, uint256 b) public pure returns (uint256) {
require(b != 0, "Division by zero");
return a / b;
}
// 整数除法:结果向下取整
function integerDivision() public pure returns (uint256) {
return 7 / 3; // 2,不是2.33
}
}
2.5 取余运算 #
solidity
contract Modulo {
function modulo(uint256 a, uint256 b) public pure returns (uint256) {
require(b != 0, "Division by zero");
return a % b;
}
// 判断奇偶
function isEven(uint256 n) public pure returns (bool) {
return n % 2 == 0;
}
}
2.6 幂运算 #
solidity
contract Power {
function power(uint256 base, uint256 exponent) public pure returns (uint256) {
return base ** exponent;
}
function square(uint256 n) public pure returns (uint256) {
return n ** 2;
}
}
三、自增自减运算 #
solidity
contract IncrementDecrement {
uint256 public count;
// 前置自增:先加后用
function preIncrement() public returns (uint256) {
return ++count;
}
// 后置自增:先用后加
function postIncrement() public returns (uint256) {
return count++;
}
// 前置自减:先减后用
function preDecrement() public returns (uint256) {
return --count;
}
// 后置自减:先用后减
function postDecrement() public returns (uint256) {
return count--;
}
}
四、复合赋值运算符 #
solidity
contract CompoundAssignment {
uint256 public value = 100;
function addAssign(uint256 n) public {
value += n; // value = value + n
}
function subtractAssign(uint256 n) public {
value -= n; // value = value - n
}
function multiplyAssign(uint256 n) public {
value *= n; // value = value * n
}
function divideAssign(uint256 n) public {
require(n != 0, "Division by zero");
value /= n; // value = value / n
}
function moduloAssign(uint256 n) public {
require(n != 0, "Division by zero");
value %= n; // value = value % n
}
}
五、溢出处理 #
5.1 Solidity 0.8.x 内置检查 #
solidity
contract OverflowCheck {
// 0.8.x版本自动检查溢出
function add(uint8 a, uint8 b) public pure returns (uint8) {
// 如果a + b > 255,自动revert
return a + b;
}
}
5.2 使用unchecked绕过检查 #
solidity
contract UncheckedBlock {
function uncheckedAdd(uint8 a, uint8 b) public pure returns (uint8) {
unchecked {
return a + b; // 不检查溢出,可能回绕
}
}
}
六、最佳实践 #
6.1 避免精度丢失 #
solidity
// 不推荐:先除后乘
function badCalculation(uint256 a, uint256 b, uint256 c) public pure returns (uint256) {
return (a / b) * c; // 精度丢失
}
// 推荐:先乘后除
function goodCalculation(uint256 a, uint256 b, uint256 c) public pure returns (uint256) {
return (a * c) / b; // 减少精度丢失
}
6.2 检查除数 #
solidity
// 推荐:总是检查除数
function safeDivide(uint256 a, uint256 b) public pure returns (uint256) {
require(b != 0, "Division by zero");
return a / b;
}
七、总结 #
算术运算符要点:
| 运算符 | 说明 | 注意事项 |
|---|---|---|
| + - * / | 基本运算 | 注意溢出 |
| % | 取余 | 除数不能为0 |
| ** | 幂运算 | 消耗较多Gas |
| ++ – | 自增自减 | 注意前置/后置 |
使用建议:
- 0.8.x版本内置溢出检查
- 使用unchecked时需谨慎
- 先乘后除减少精度丢失
- 总是检查除数是否为0
接下来,让我们学习比较与逻辑运算符!
最后更新:2026-03-27