如何处理以太坊智能合约中的浮点数



最近,我一直在学习以太坊智能合约的开发。我有一个关于以下代码的问题;用a法得到的结果为4。这个结果和我的常识理解是一样的,因为在浮点处理中,运行时会截获相应的浮点数。然而,当我调用方法"b"时,结果是5。我不太理解这个结果。是因为编译器在编译过程中进行了优化,直接计算结果并存储它吗?非常感谢,伙计们。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Test {
uint constant c = 5;

function a() public pure returns(uint){
return c/2 + c/2;
}   

function b() public pure returns(uint){
return 5/2 + 5/2;
}
}

编译器似乎优化了return 5/2 + 5/2;行。在汇编输出中,用solc-v0.8.13 --asm --optimize-run=100000编译后,有以下几行:

/* "Test.sol":215:224  5/2 + 5/2 */
0x05
/* "Test.sol":208:224  return 5/2 + 5/2 */
swap1
pop

什么指示0x05值是直接从函数调用返回的。

在函数a中,整数除法向下取整,因此返回值为0x04。编译器不会优化这一行,即使它对constant和文字进行操作,并允许在EVM上运行整数除法。

值得一提的是,扎实是一种不断发展的语言。因此,未来的编译器版本可能会以这样一种方式优化代码,即本例中的函数将给出相同的结果。

相关内容

  • 没有找到相关文章

最新更新