W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
上溢或下溢是指算術(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)換除外。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: