Rust中u128乘法错误吗?

时间:2019-02-23 15:17:33

标签: rust

在打开错误之前,我想检查一下这里发生的事情。

我正在将此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中重新创建精确的计算,因为这是哈希计算所必需的。

1 个答案:

答案 0 :(得分:6)

我看起来您必须用两种语言都打过字:

print(soup)

off-by-0x100000000错误的经典情况:)