有没有办法在 Javascript 中正确地将两个 32 位整数相乘?

2023-11-23

有没有办法在 Javascript 中正确地将两个 32 位整数相乘?

当我从 C 尝试使用long long我明白了:

printf("0x%llx * %d = %llx\n", 0x4d98ee96ULL, 1812433253,
      0x4d98ee96ULL * 1812433253);
==> 0x4d98ee96 * 1812433253 = 20becd7b431e672e

但从 Javascript 来看,结果是不同的:

x = 0x4d98ee97 * 1812433253;
print("0x4d98ee97 * 1812433253 = " + x.toString(16));
==> 0x4d98ee97 * 1812433253 = 20becd7baf25f000

尾随的零让我怀疑 Javascript 在 32 到 64 位之间的整数分辨率有一个奇怪的限制。

有没有办法得到正确答案? (我在 x86_64 Fedora 15 上使用 Mozilla js-1.8.5,以防万一。)


这似乎可以在没有外部依赖的情况下完成我想要的事情:

function multiply_uint32(a, b) {
    var ah = (a >> 16) & 0xffff, al = a & 0xffff;
    var bh = (b >> 16) & 0xffff, bl = b & 0xffff;
    var high = ((ah * bl) + (al * bh)) & 0xffff;
    return ((high << 16)>>>0) + (al * bl);
}

这将执行 32 位模 2^32 乘法,这是计算的正确下半部分。类似的函数可用于计算正确的上半部分并将其存储在单独的整数中(ah * bh 似乎是正确的),但我碰巧不需要它。

注意零移。如果没有这个功能,只要设置高位,该函数就会生成负值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法在 Javascript 中正确地将两个 32 位整数相乘? 的相关文章