首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Yul指令‘high’不像高级除法操作符那样工作?

为什么Yul指令‘high’不像高级除法操作符那样工作?
EN

Ethereum用户
提问于 2023-03-09 18:19:05
回答 1查看 27关注 0票数 1

我注意到以下实体函数不是等效的:

代码语言:javascript
复制
function a(int256 x) pure returns (uint256 result) {
    assembly {
        result := div(sub(0, x), x) 
    }
}

function b(int256 x) pure returns (uint256 result) {
    result = -x / x;
}

如果作为输入传递8,则返回两个不同的结果:

代码语言:javascript
复制
a: 14474011154664524427946373126085988481658748083205070504932198000989141204991
b: -1

怎么回事?我原以为结果是一样的。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2023-03-09 18:19:05

这种解释与这样一个事实有关: Solidity (和EVM)使用二补系统来存储有符号的值。

在函数a中,sub(0, x)具有此值(当x为8时):

代码语言:javascript
复制
115792089237316195423570985008687907853269984665640564039457584007913129639928

这个数字实际上是两个补码中的-8。但是a不返回-1,因为使用的Yul指令是div,它不能处理有符号的值。

为了使这两个函数等价,我们可以使用sdiv指令:

代码语言:javascript
复制
function a(int256 x) pure returns (uint256 result) {
    assembly {
        result := sdiv(sub(0, x), x) 
    }
}

这将为ab返回D12

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

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

复制
相关文章

相似问题

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