“模拟” JavaScript中的32位整数溢出

问题描述 投票:11回答:3

JavaScript可以很好地处理以下数学:

var result = (20000000 * 48271) % 0x7FFFFFFF;

但是在某些编程语言中,第一个int*int乘法导致值太大而无法容纳标准的32位整数。是否有任何方法可以在JavaScript中“模拟”,并查看如果乘法导致整数溢出,结果将是什么?

javascript integer-overflow
3个回答
4
投票

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

但是,据我所知,实际上没有办法得到溢出(高32位),但是您在答案中显示的模数摆脱了这些信息,所以我认为这不是您想要的。如果他们要溢出,则无论如何都必须根据有符号和无符号将其分开。

我知道这可以在Chrome,Firefox和Opera中使用,尽管不确定IE是否具有此功能(典型),但不确定其余的功能。您需要使用this one之类的填充程序。


2
投票

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

要转换为有符号的32位整数

x = (a * b) | 0;

要转换为无符号32位整数

x = (a * b) >>> 0;

0
投票

实现此目的的另一种方法是转换为一种格式,在转换回整数之前,可以删除多余的字节。对于JS而言,这可能不是最佳选择,但在运算符确实受限的环境中可能会有所帮助。

例如使用十六进制:

var hugeInteger = 999999999999999;
var ui32 = parseInt(hugeInteger.toString(16).slice(-8), 16);
// ui32 == 2764472319

也有可能从hugeInteger.toString(16).slice(0,-8)中获取溢出>

© www.soinside.com 2019 - 2024. All rights reserved.