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)
然后,z将Infinity.
事实证明,这取决于你溢出/下溢的程度.如果你走得太远,你会得到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 = <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>Run Code Online (Sandbox Code Playgroud)
最大值和最小值为+/- 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)
| 归档时间: |
|
| 查看次数: |
14008 次 |
| 最近记录: |