我注意到以下实体函数不是等效的:
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,则返回两个不同的结果:
a: 14474011154664524427946373126085988481658748083205070504932198000989141204991
b: -1怎么回事?我原以为结果是一样的。
发布于 2023-03-09 18:19:05
这种解释与这样一个事实有关: Solidity (和EVM)使用二补系统来存储有符号的值。
在函数a中,sub(0, x)具有此值(当x为8时):
115792089237316195423570985008687907853269984665640564039457584007913129639928这个数字实际上是两个补码中的-8。但是a不返回-1,因为使用的Yul指令是div,它不能处理有符号的值。
为了使这两个函数等价,我们可以使用sdiv指令:
function a(int256 x) pure returns (uint256 result) {
assembly {
result := sdiv(sub(0, x), x)
}
}这将为a和b返回D12。
https://ethereum.stackexchange.com/questions/147168
复制相似问题