Javascript是否处理整数溢出和下溢?如果有,怎么样? [英] Does Javascript handle integer overflow and underflow? If yes, how?

查看:1423
本文介绍了Javascript是否处理整数溢出和下溢?如果有,怎么样?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

We know that Java does not handle underflows and overflows, but how does Javascript handle these for integers?

它是否回到最小/最大?如果是,哪个最小/最大?

Does it go back to a minimum/maximum? If yes, which minimum/maximum?

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

I need to split a string and compute a hash value based on its characters.

推荐答案

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

In a simple test, when I try this:

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

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

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

I find that x and max have the same value (in Chrome, IE and Firefox) so it appears that some overflows are just pegged to the max value. And, y gets pegged to 0 so some underflows seem to go to zero.

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

Ahhh, but it is not quite that simple. Not all overflows go to Number.MAX_VALUE and not all underflows go to Number.MIN_VALUE. If you do this:

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

然后, z 无穷大

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

It turns out that it depends upon how far you overflow/underflow. If you go too far, you will get INFINITY instead. This is because of the use of IEEE 754 round-to-nearest mode where the max value can be considered nearer than infinity. See Adding to Number.MAX_VALUE for more detail. Per that answer, values of 1.7976931348623158 × 10308 or greater round to infinity. Values between Number.MAX_VALUE and that will round to Number.MAX_VALUE.

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

To, make things even more complicated, there is also something as gradual underflow which Javascript supports. This is where the mantissa of the floating point value has leading zeroes in it. Gradual underflow allows floating point to represent some smaller numbers that it could not represent without that, but they are represented at a reduced precision.

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

You can see exactly where the limits are:

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

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

Here's a runnable snippet you can try in any browser:

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>

这篇关于Javascript是否处理整数溢出和下溢?如果有,怎么样?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆