首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在yul中如何分配负数?

在yul中如何分配负数?
EN

Ethereum用户
提问于 2021-03-30 15:33:31
回答 2查看 378关注 0票数 1

取下面的代码片段:

代码语言:javascript
复制
function powOfTen(uint256 x) internal pure returns (int256 result) {
    assembly {
        switch x
        case 1 { result := -18 }
    }
}

它不编译:

代码语言:javascript
复制
ParserError: Literal or identifier expected.
   --> contracts/PRBMath.sol:352:32:
    |
352 |             case 1 { result := -18 }
    |

我如何分配一个负数在yul中?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2021-03-30 16:41:09

这是因为您需要使用二补表示来使用yul中的带符号整数,因为EVM就是这样理解它们的:

关于稳健文档中的两个补充,有一些评论:

所以,解决你的疑问:

-15表示为:0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1

-3表示为:0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd

代码语言:javascript
复制
function powOfTen(uint256 x) public pure returns (int256 result) {
    assembly {
        switch x
        case 1 { result := 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1 }
        case 2 { result := 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd }
    }
}

我已经将函数从internal修改为public,如果您想在Remix上测试它的话。

票数 2
EN

Ethereum用户

发布于 2021-03-31 08:10:03

@alberto解决方案的另一种选择是使用sub指令:

代码语言:javascript
复制
function powOfTen(uint256 x) internal pure returns (int256 result) {
    assembly {
        switch x
        case 1 { result := sub(0, 18) }
    }
}

这样做的好处是它更干净,但在启用优化器编译时仍然需要支付相同的气体量。这归功于吉特用户@hrkrshnn告诉我这种方法。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/96426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档