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

Jér*_*nge 15 javascript integer overflow underflow

我们知道Java不处理下溢和溢出,但是Javascript如何处理整数?

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

我需要拆分一个字符串并根据其字符计算一个哈希值.

jfr*_*d00 23

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

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

var min = Number.MIN_VALUE;
var y = min / 10;
Run Code Online (Sandbox Code Playgroud)

我发现x并且max具有相同的值(在Chrome,IE和Firefox中),因此看起来有些溢出只是与最大值挂钩.而且,y被盯住,0所以一些下溢似乎变为零.

啊,但事情并不那么简单.并非所有溢出都会发生Number.MAX_VALUE,并非所有下溢都会发生Number.MIN_VALUE.如果你这样做:

var max = Number.MAX_VALUE;
var z = max * 2;
Run Code Online (Sandbox Code Playgroud)

然后,zInfinity.

事实证明,这取决于你溢出/下溢的程度.如果你走得太远,你会得到INFINITY.这是因为使用IEEE 754舍入到最近模式,其中最大值可以被认为比无穷大更近.有关更多详细信息,请参见添加到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
Run Code Online (Sandbox Code Playgroud)

这是一个可以在任何浏览器中尝试的可运行代码段:

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;
Run Code Online (Sandbox Code Playgroud)
body {
    font-family: "Courier New"; 
    white-space:nowrap;
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)

  • 然而`Number.MAX_VALUE*2`导致`无限'.正如他们所说,"去图". (5认同)
  • 对于浮点数,添加一个带有更大数字`(2 ^ 54*x)`的`x`小数字由于舍入而被简单地忽略,而乘法总是可以执行(直到指数溢出).对于任何想知道bernhard结果的人. (2认同)

Rah*_*thi 5

最大值和最小值为+/- 9007199254740992

试试这些Number 类型的属性

alert([Number.MAX_VALUE, Number.MIN_VALUE]);
Run Code Online (Sandbox Code Playgroud)

来自 ECMAScript 2020 语言规范的“数字类型”部分

请注意,所有大小不大于 2 53 的正负数学整数都可以在 Number 类型中表示(实际上,数学整数 0 有两种表示形式,+0 和 ?0)。

测试:

var x = 9007199254740992;
var y = -x;
x == x + 1; // true !
y == y - 1; // also true !
Run Code Online (Sandbox Code Playgroud)

  • 我认为这实际上并没有回答 OP 的问题。 (4认同)
  • 好的,但是 JS 是如何处理上溢和下溢的呢? (2认同)
  • 答案中的链接是垃圾邮件 (2认同)