Javascript 是否处理整数溢出和下溢?如果是,如何?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19054891/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-27 14:11:59  来源:igfitidea点击:

Does Javascript handle integer overflow and underflow? If yes, how?

javascriptintegeroverflowunderflow

提问by Jér?me Verstrynge

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

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

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.

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

回答by jfriend00

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;

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

我发现,xmax有相同的值(在Chrome,IE和Firefox),所以它似乎有些溢出只是盯住最大值。而且,y被盯住,0所以一些下溢似乎变为零。

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

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

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

Then, zwill be Infinity.

那么,zInfinity

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_VALUEfor more detail. Per that answer, values of 1.7976931348623158 × 10308or greater round to infinity. Values between Number.MAX_VALUE and that will round to Number.MAX_VALUE.

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

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.

为了让事情变得更加复杂,Javascript 还支持渐进下溢。这是浮点值的尾数有前导零的地方。渐进下溢允许浮点表示一些较小的数字,如果没有它就无法表示,但它们以降低的精度表示。

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>

回答by Rahul Tripathi

The maximum and minimum is +/- 9007199254740992

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

Try this:

试试这个

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

From here:-

这里:-

Note that all the positive and negative integers whose magnitude is no greater than 253are representable in the Number type (indeed, the integer 0 has two representations, +0 and ?0).

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

Test this:-

测试这个:-

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