console.log(-559038841 * 2654435761); //returns -1483932691338393000
console.log(Math.imul(-559038841 , 2654435761)); // returns 1445956183.
我期望这两个具有相同的值,但它们没有。为什么会这样?
我想这与数学的32位特性有关。我想,但不确定。
根据规范,Math.imul
不仅在执行乘法运算前将其操作数转换为无符号32位整数,而且还通过对结果[1]执行modulo 2^32
将结果限制为32位整数。因此,最终结果不可能大于2^32 - 1
,即4294967295
。
之后,它还通过将最高有效位作为符号位将其转换为有符号整数,因此实际的最终结果在-(2^31)
和2^31 - 1
之间,或者在-2147483648
和2147483647
之间
[1]我想在实践中,引擎只是简单地去掉多余的位,保留不太重要的32位。但效果和对2^32取模是一样的。