Solidity
當移位操作的結果不適合左操作數的類型時會發生什麼?
例如,採用以下程式碼:
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 左右的轉換,可以更清楚地看到這一點。編譯器會抱怨以下錯誤: