Solidity

當移位操作的結果不適合左操作數的類型時會發生什麼?

  • March 23, 2021

例如,採用以下程式碼:

pragma solidity ^0.8.0;

function foo() external pure returns (uint256, uint256, uint256) {
   uint256 i1 = uint256(2) << 255;
   uint256 i2 = uint256(4) << 255;
   uint256 i3 = uint256(8) << 255;
   return (i1, i2, i3);
}

在純數學意義上,結果應該是(2**256, 2**257, 2**258)。但是這些數字超出了 允許的最大值uint256,即2**256 - 1

在這種情況下,Solidity 做了什麼?

根據文件,Solidity 會截斷結果:

移位操作的結果具有左操作數的類型,截斷結果以匹配類型。

所以在上面的例子中,第一位、兩位和三位分別被截斷。實際結果是(0, 0, 0)

如果您刪除 2、4 或 8 左右的轉換,可以更清楚地看到這一點。編譯器會抱怨以下錯誤:

Solidity 抱怨字面量太大

引用自:https://ethereum.stackexchange.com/questions/95106