Javascript处理整数溢出和下溢吗?如果是,如何进行?

Javascript处理整数溢出和下溢吗?如果是,如何进行?,javascript,integer,overflow,underflow,Javascript,Integer,Overflow,Underflow,我们知道这一点,但是Javascript如何处理这些整数呢 它是否回到最小值/最大值?如果是,最小值/最大值是多少 我需要拆分字符串并根据其字符计算哈希值。最大值和最小值为+/-9007199254740992 试试这些: ECMAScript 2020语言规范第节: 请注意,大小为no的所有正整数和负整数 大于253表示为数字类型(实际上是 数学整数0有两种表示形式,+0和−0) 测试: 在一个简单的测试中,当我尝试以下操作时: var max = Number.MAX_VALUE; var

我们知道这一点,但是Javascript如何处理这些整数呢

它是否回到最小值/最大值?如果是,最小值/最大值是多少


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

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

试试这些:

ECMAScript 2020语言规范第节:

请注意,大小为no的所有正整数和负整数 大于253表示为数字类型(实际上是 数学整数0有两种表示形式,+0和−0)

测试:


在一个简单的测试中,当我尝试以下操作时:

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
挂钩,因此一些下溢似乎为零

啊,但事情并不是那么简单。并非所有溢出都进入编号。最大值,并非所有下溢都进入编号。最小值。如果您这样做:

var max = Number.MAX_VALUE;
var z = max * 2;
然后,
z
将是
无限

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

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

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

>>> Number.MAX_VALUE + 9.979201e291
1.7976931348623157e+308
>>> Number.MAX_VALUE + 9.979202e291
Infinity
以下是一个可运行的代码段,您可以在任何浏览器中尝试:

var max=Number.max\u值;
var x=最大值+10;
var min=Number.min_值;
变量y=最小值/10;
var z=最大值*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
正文{
字体系列:“信使新”;
空白:nowrap;
}
Number.MAX\u值=
Number.MAX_值+10=

Number.MIN_值=
Number.MIN\u值/10=

Number.MAX_值*2=
Number
在JavaScript中,数字类型是不是整数的64位IEEE 754浮点数字。因此,它不遵循其他语言中整数溢出/下溢行为的常见模式

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

位运算符 逐位运算符处理操作数32位整数。和其他语言一样,可能会发生常见的整数溢出。计算后只能保留最后32位。例如,
3>
将操作数视为无符号32位整数。所有其他运算符都将操作数视为有符号32位整数。如果要将有符号整数转换为无符号整数,可以编写
值>>>0
来执行此操作。要转换回,请使用
value | 0

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

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

打字机 对于TypedArray类型,当指定的整数超出支持的范围时,它会像其他语言在转换整数时一样被截断,保留最低有效位。例如
新的Int8Array([1000])[0]
got
-24

asm.js
这里应用了与位运算符相同的规则。该值将以
|0
>>0
的方式返回。

好的,但是JS如何处理溢出和下溢?我认为这实际上没有回答OP的问题。@jfriend00:-用一个有帮助的链接更新了我的答案。如果我完全忽略了明显的问题,请纠正我!!!:)Rahul,你真的运行了警报([Number.MAX\u VALUE,Number.MIN\u VALUE]);在犹他州?我不认为Number.MIN_值是你所认为的…答案中的链接是SPAMI尝试了-Number.MAX_值,它们也是一样的。因此,不必返回到最小值和最大值……也为下溢添加了信息。但是
Number.MAX_VALUE*2
会导致
无穷大
。正如他们所说的“去数字”。对于浮点数,加上一个
x
小的数和一个大得多的数
(2^54*x)
由于四舍五入而被忽略,而乘法总是可以执行的(直到指数溢出)。对于任何想知道bernhard结果的人。
1.7976931348623157e+308+0.0000000000000001e+308==无穷大
var max = Number.MAX_VALUE;
var z = max * 2;
>>> Number.MAX_VALUE + 9.979201e291
1.7976931348623157e+308
>>> Number.MAX_VALUE + 9.979202e291
Infinity