Rust序列求和函数编译为x64与WebAssembly运行结果差异咨询
问题根因
- 输出解析规则差异:WebAssembly的
i64类型本身不携带signed/unsigned标识,仅在运算时通过不同指令区分符号逻辑。你得到的负数值-5340232216128654848是wasmtime默认将返回的i64结果按有符号整数解析的产物,将该值转换为无符号u64后和x64架构的运行结果13106511857580896768完全一致:
二者二进制表示没有任何差异,只是上层解析规则不同。2^64 + (-5340232216128654848) = 13106511857580896768 - 执行命令存在参数错误:你声称传入的参数是
x=10000000000,但给出的wasmtime命令中实际传入的参数是1000000000(少了一个0),需要先核对参数传递正确性。 - 导出函数名不匹配:你贴出的WASM文本中导出的函数名为
sum,而非你调用的sum_sequence,如果实际运行中存在该问题会导致调用到错误函数,需要修正导出配置。
修正方案
- 给Rust函数加上正确的导出标记,确保函数名匹配:
#[no_mangle] pub extern "C" fn sum_sequence(x: u64) -> u64 { let mut s: u64 = 0; for n in 1..=x { s = s + n; } s } - 调用
wasmtime时传入正确的参数值10000000000。 - 调整结果解析逻辑:如果需要直接得到无符号格式的输出,可以在WASM侧新增一层包装函数,将计算得到的
u64转为字符串后返回给宿主环境;也可以直接将wasmtime输出的负数值手动转换为u64即可得到正确结果。
内容的提问来源于stack exchange,提问作者Finnfalter
相关产品推荐
相关产品推荐

