算术运算符 #

一、算术运算符概述 #

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