檢查或未檢查的算術(shù)

2022-05-12 17:34 更新

上溢或下溢是指算術(shù)運算的結(jié)果值在對不受限制的整數(shù)執(zhí)行時超出結(jié)果類型范圍的情況。

在 Solidity 0.8.0 之前,算術(shù)運算總是會在出現(xiàn)不足或溢出的情況下進行換行,從而導(dǎo)致廣泛使用引入額外檢查的庫。

從 Solidity 0.8.0 開始,默認情況下所有算術(shù)運算都會在上溢和下溢時恢復(fù),因此無需使用這些庫。

要獲得先前的行為,unchecked可以使用一個塊:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract C {
    function f(uint a, uint b) pure public returns (uint) {
        // This subtraction will wrap on underflow.
        unchecked { return a - b; }
    }
    function g(uint a, uint b) pure public returns (uint) {
        // This subtraction will revert on underflow.
        return a - b;
    }
}

調(diào)用將返回,而將導(dǎo)致斷言失敗。f(2, 3)2**256-1g(2, 3)

塊可以在unchecked塊內(nèi)的任何地方使用,但不能作為塊的替代品。它也不能嵌套。

該設(shè)置僅影響語法上位于塊內(nèi)的語句。從unchecked塊中調(diào)用的函數(shù)不繼承該屬性。

筆記

為避免歧義,您不能在塊_;內(nèi)使用。unchecked

以下運算符將導(dǎo)致上溢或下溢斷言失敗,如果在未經(jīng)檢查的塊中使用,則將無錯誤地回繞:

++, --, +, 二元-, 一元-, *, /, %,**

+=, -=, *=, /=,%=

警告

unchecked無法使用該塊禁用除以零或模零的檢查。

筆記

位運算符不執(zhí)行上溢或下溢檢查。<<當使用按位移位 ( , >>, <<=, >>=) 代替整數(shù)除法和乘以 2 的冪時,這一點尤其明顯。例如,即使會恢復(fù)也不會恢復(fù)。type(uint256).max << 3type(uint256).max * 8

筆記

第二條語句將導(dǎo)致溢出,因為負范圍可以比正范圍多保存一個值。int x = type(int).min; -x;

顯式類型轉(zhuǎn)換將始終截斷并且永遠不會導(dǎo)致斷言失敗,但從整數(shù)到枚舉類型的轉(zhuǎn)換除外。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號