在打开错误之前,我想检查一下这里发生的事情。
我正在将此C代码移植到Rust:
unsigned __int128 r = (unsigned __int128)a * (unsigned __int128)b;
足够容易(我认为):
let r = (a as u128) * (b as u128);
现在使用此输入参数,我在C和Rust中得到了不同的乘法结果:
(0x56eaa5f5f650a9e3 as u128) * (0xa0cf24341e75bda9 as u128)
Rust和C中的结果不同:
Rust: 0x3698fbc09d2c5b15e8889b1b676bbddb
C: 0x3698fbc0f417010bded944fe676bbddb
^^^^^^^^^^^^^^^^
我cross-checked the result,并得到与C代码相同的结果。
我想念什么吗?
===添加了上下文信息:
这是xmr-stak(https://github.com/fireice-uk/xmr-stak)中的此函数,其行为有所不同:
static inline uint64_t _umul128(uint64_t a, uint64_t b, uint64_t* hi)
{
unsigned __int128 r = (unsigned __int128)a * (unsigned __int128)b;
*hi = r >> 64;
return (uint64_t)r;
}
无论C实现是否错误,我都必须在Rust中重新创建精确的计算,因为这是哈希计算所必需的。
答案 0 :(得分:6)
我看起来您必须用两种语言都打过字:
print(soup)
off-by-0x100000000错误的经典情况:)