You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:
        }
    }
}

代码逻辑说明

  1. 两两比较取大:先分别对(num1,num2)、(num3,num4)进行比较,通过jumpi条件跳转,将较大值存入临时变量winnerA和winnerB
  2. 最终比较:再对winnerA和winnerB做比较,同样通过条件跳转将最大值赋值给result
  3. 全程操作的都是输入的实际数字,而非布尔标识,确保返回的是正确的最大值

内容的提问来源于stack exchange,提问作者Taylor Lepper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:01:43