Solidity汇编实现四数取最大值:代码始终返回0求助
Solidity汇编实现四数取最大值问题修复
原代码核心错误分析
你的代码逻辑完全偏离了取最大值的目标:
gt(num1, num2)返回的是布尔标识(1表示num1更大,0表示num2更大),而非num1或num2本身,所以winnerA、winnerB存储的是判断结果,不是实际的较大数字- 后续通过
gt(winnerA, winnerB)比较两个布尔值,最终将布尔值赋值给result,自然只会返回0或1,不可能得到正确的最大值
修正后的代码实现
下面是正确的汇编逻辑,分三步两两比较取大,最终得到四个数的最大值:
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.4.26; contract LargestOfFourNums { function largestOfFour( uint256 num1, uint256 num2, uint256 num3, uint256 num4 ) public view returns (uint256 result) { assembly { // 第一步:取出num1和num2中的较大值存入winnerA jumpi(skip_num2, gt(num1, num2)) let winnerA := num2 jump(compare_num3_num4) skip_num2: let winnerA := num1 compare_num3_num4: // 第二步:取出num3和num4中的较大值存入winnerB jumpi(skip_num4, gt(num3, num4)) let winnerB := num4 jump(compare_final) skip_num4: let winnerB := num3 compare_final: // 第三步:取出winnerA和winnerB中的较大值作为最终结果 jumpi(skip_winnerB, gt(winnerA, winnerB)) result := winnerB jump(end) skip_winnerB: result := winnerA end: } } }
代码逻辑说明
- 两两比较取大:先分别对(num1,num2)、(num3,num4)进行比较,通过
jumpi条件跳转,将较大值存入临时变量winnerA和winnerB - 最终比较:再对
winnerA和winnerB做比较,同样通过条件跳转将最大值赋值给result - 全程操作的都是输入的实际数字,而非布尔标识,确保返回的是正确的最大值
内容的提问来源于stack exchange,提问作者Taylor Lepper
相关产品推荐
相关产品推荐

