JavaScript可以很好地处理以下数学:
var result = (20000000 * 48271) % 0x7FFFFFFF;
但是在某些编程语言中,第一个int*int
乘法导致值太大而无法容纳标准的32位整数。是否有任何方法可以在JavaScript中“模拟”,并查看如果乘法导致整数溢出,结果将是什么?
[在较新的浏览器中,Math.imul(a,b)
将为您提供实际的32位整数相乘结果,并以您期望的方式溢出(它返回64位结果的下半部分作为返回值)。
但是,据我所知,实际上没有办法得到溢出(高32位),但是您在答案中显示的模数摆脱了这些信息,所以我认为这不是您想要的。如果他们要溢出,则无论如何都必须根据有符号和无符号将其分开。
我知道这可以在Chrome,Firefox和Opera中使用,尽管不确定IE是否具有此功能(典型),但不确定其余的功能。您需要使用this one之类的填充程序。
可以通过“滥用” JavaScript中可用的按位运算符来模拟32位整数(因为它们只能返回该范围内的整数)。
要转换为有符号的32位整数:
x = (a * b) | 0;
要转换为无符号32位整数:
x = (a * b) >>> 0;
实现此目的的另一种方法是转换为一种格式,在转换回整数之前,可以删除多余的字节。对于JS而言,这可能不是最佳选择,但在运算符确实受限的环境中可能会有所帮助。
例如使用十六进制:
var hugeInteger = 999999999999999;
var ui32 = parseInt(hugeInteger.toString(16).slice(-8), 16);
// ui32 == 2764472319
也有可能从hugeInteger.toString(16).slice(0,-8)
中获取溢出>