Assembly

如何在yul中分配負數?

  • March 31, 2021

拿這個程式碼片段:

function powOfTen(uint256 x) internal pure returns (int256 result) {
   assembly {
       switch x
       case 1 { result := -18 }
   }
}

哪個不編譯:

ParserError: Literal or identifier expected.
  --> contracts/PRBMath.sol:352:32:
   |
352 |             case 1 { result := -18 }
   |

如何在 yul 中分配負數?

那是因為你需要使用二進制補碼表示來在 yul 中使用有符號整數,因為這是 EVM 理解它們的方式:

在 Solidity 文件中有一些關於 Two’s Complement 的評論:

所以,解決你的疑問:

-15表示為:0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1

-3表示為:0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd

function powOfTen(uint256 x) public pure returns (int256 result) {
   assembly {
       switch x
       case 1 { result := 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1 }
       case 2 { result := 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd }
   }
}

如果您想在 Remix 上對其進行測試,我已將該功能從 修改為internalpublic

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