"模拟"JavaScript中的32位整数溢出

IQA*_*eas 10 javascript integer-overflow

JavaScript可以处理以下数学:

var result = (20000000 * 48271) % 0x7FFFFFFF;
Run Code Online (Sandbox Code Playgroud)

但是在某些编程语言中,第一次int*int乘法导致的值太大而无法保存在标准的32位整数中.有没有办法在JavaScript中"模拟"这个,并看看如果乘法导致整数溢出,结果计算会是什么?

TND*_*TND 8

在较新的浏览器中,Math.imul(a,b)将为您提供实际的 32 位整数乘法结果,并以您期望的方式产生溢出结果(它返回 64 位结果的下半部分)。

然而,据我所知,实际上没有办法获得溢出(高 32 位),但您在答案中显示的模数会消除该信息,所以我认为这不是您想要的。如果他们要进行溢出,无论如何他们都必须根据签名和未签名将其分开。

我知道这在 Chrome、Firefox 和 Opera 中有效,不确定其余的,但很确定 IE 没有它(典型)。您需要退回到像这样的垫片。

  • 不,当您将两个 32 位数字以二进制补码相乘时,它会产生一个 64 位结果,尽管无论乘法是否带符号,下半部分都是正确的 - 这是上半部分,即溢出,根据符号性而变化。请参阅http://stackoverflow.com/questions/14063599/why-are-signed-and-unsigned-multiplication- Different-instructions-on-x86-64 (2认同)

IQA*_*eas 8

通过“滥用”JavaScript 中可用的按位运算符可以模拟 32 位整数(因为它们只能返回该范围内的整数)。

转换为有符号 32 位整数

x = (a * b) | 0;
Run Code Online (Sandbox Code Playgroud)

转换为无符号 32 位整数

x = (a * b) >>> 0;
Run Code Online (Sandbox Code Playgroud)

  • 这不能正确处理溢出。必须使用 `Math.imul` 来代替。 (6认同)