我们知道Java does not handle underflows and overflows,但是Javascript如何处理整数?
是否会回到最低/最高?如果是,最小/最大?
我需要拆分字符串并根据字符计算哈希值。
答案 0 :(得分:21)
在一个简单的测试中,当我尝试这个时:
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
挂钩,因此一些下溢似乎变为零。
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 = <span id="max"></span><br>
Number.MAX_VALUE + 10 = <span id="max10"></span><br>
<br>
Number.MIN_VALUE = <span id="min"></span><br>
Number.MIN_VALUE / 10 = <span id="min10"></span><br>
<br>
Number.MAX_VALUE * 2 = <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_INTEGER
到 Number.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 类型,当分配的整数超出支持的范围时,它会像其他语言一样在转换整数时通过保留最低有效位而被截断。例如 new Int8Array([1000])[0]
得到 -24
。
此处适用的按位运算符的相同规则。该值将像 | 0
或 >>> 0
所做的那样返回。