Javascript是否处理整数溢出和下溢?如果有,怎么样?

时间:2013-09-27 15:43:56

标签: javascript integer overflow underflow

我们知道Java does not handle underflows and overflows,但是Javascript如何处理整数?

是否会回到最低/最高?如果是,最小/最大?

我需要拆分字符串并根据字符计算哈希值。

3 个答案:

答案 0 :(得分:21)

在一个简单的测试中,当我尝试这个时:

var max = Number.MAX_VALUE;
var x = max + 10;

var min = Number.MIN_VALUE;
var y = min / 10;

我发现xmax具有相同的值(在Chrome,IE和Firefox中),所以看起来有些溢出只是与最大值挂钩。并且y0挂钩,因此一些下溢似乎变为零。

啊,但事实并非那么简单。并非所有溢出都转到Number.MAX_VALUE,并非所有下溢都转到Number.MIN_VALUE。如果你这样做:

var max = Number.MAX_VALUE;
var z = max * 2;

然后,z将为Infinity

事实证明,这取决于你上溢/下溢的程度。如果你走得太远,你会得到INFINITY。这是因为使用IEEE 754舍入到最近模式,其中最大值可以被认为比无穷大更近。有关详细信息,请参阅Adding to Number.MAX_VALUE。根据该答案,值为1.7976931348623158×10 308 或更大,为无穷大。 Number.MAX_VALUE与之间的值将舍入为Number.MAX_VALUE。

为了使事情变得更复杂,Javascript也支持逐渐下溢。这是浮点值的尾数在其中具有前导零的位置。逐渐下溢允许浮点表示一些较小的数字,如果没有它,它们就无法表示,但它们的表示精度会降低。

您可以确切地看到限制的位置:

>>> Number.MAX_VALUE + 9.979201e291
1.7976931348623157e+308
>>> Number.MAX_VALUE + 9.979202e291
Infinity

以下是您可以在任何浏览器中尝试的可运行代码段:

var max = Number.MAX_VALUE;
var x = max + 10;

var min = Number.MIN_VALUE;
var y = min / 10;

var z = max * 2;

document.getElementById("max").innerHTML = max;
document.getElementById("max10").innerHTML = x;
document.getElementById("min").innerHTML = min;
document.getElementById("min10").innerHTML = y;
document.getElementById("times2").innerHTML = z;
body {
    font-family: "Courier New"; 
    white-space:nowrap;
}
Number.MAX_VALUE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= <span id="max"></span><br>
Number.MAX_VALUE + 10 = <span id="max10"></span><br>
<br>
Number.MIN_VALUE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= <span id="min"></span><br>
Number.MIN_VALUE / 10 = <span id="min10"></span><br>  
<br>
Number.MAX_VALUE * 2 &nbsp;= <span id="times2"></span><br>

答案 1 :(得分:4)

最高和最低 +/- 9007199254740992

尝试this

alert([Number.MAX_VALUE, Number.MIN_VALUE]);

来自here: -

  

注意所有正数和负数的整数,其大小为否   在数字类型中可以表示大于2 53 (事实上,   整数0有两个表示,+ 0和-0)。

测试一下: -

var x = 9007199254740992;
var y = -x;
x == x + 1; // true !
y == y - 1; // also true !

答案 2 :(得分:0)

Number

在 JavaScript 中,数字类型是 64 位 IEEE 754 浮点数,它不是整数。所以它不遵循其他语言中整数溢出/下溢行为的常见模式。

作为浮点数,基本部分使用 53 位。它可以表示 Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER(-253+1 到 253-1)范围内的数字,没有浮点错误。对于超出此范围的数字,可能会四舍五入到最接近的可用数字,如果太大则可能为无穷大。

按位运算符

按位运算符处理操作数 32 位整数。和其他语言一样,可能会发生常见的整数溢出。计算后只能保留最后 32 位。例如,3<<31 将导致 -2147483648

>>> 将操作数视为无符号 32 位整数。所有其他运算符将操作数视为有符号的 32 位整数。如果你想将有符号整数转换为无符号整数,你可以写 value >>> 0 来完成这个技巧。要转换回来,请使用 value | 0

如果你想用 33 移动一个整数,它实际上会被移动 1。

BigInt

就像 Java 的 java.math.BigInteger 一样,BigInt 支持无界整数(尽管仍受内存限制)。所以整数溢出在这里可能永远不会发生。

TypedArray

对于 TypedArray 类型,当分配的整数超出支持的范围时,它会像其他语言一样在转换整数时通过保留最低有效位而被截断。例如 new Int8Array([1000])[0] 得到 -24

asm.js

此处适用的按位运算符的相同规则。该值将像 | 0>>> 0 所做的那样返回。