如何在Javascript中避免小整数溢出
我正在读道格拉斯·克罗克福德的书《Javascript好的部分》,他说: JavaScript只有一个数字类型。在内部,它表示为64位浮点,与Java的双精度浮点相同。与大多数其他编程语言不同,没有单独的整数类型,因此1和1.0是相同的值。这是一个极大的便利,因为短整数中的溢出问题被完全避免了 我不太熟悉其他语言,所以我想解释一下。我能理解为什么64位有帮助,但他的说法似乎适用于缺少浮动和双精度如何在Javascript中避免小整数溢出,javascript,Javascript,我正在读道格拉斯·克罗克福德的书《Javascript好的部分》,他说: JavaScript只有一个数字类型。在内部,它表示为64位浮点,与Java的双精度浮点相同。与大多数其他编程语言不同,没有单独的整数类型,因此1和1.0是相同的值。这是一个极大的便利,因为短整数中的溢出问题被完全避免了 我不太熟悉其他语言,所以我想解释一下。我能理解为什么64位有帮助,但他的说法似乎适用于缺少浮动和双精度 什么是JS中不会出现的短整数溢出情况(可能是伪代码)?假设您有一个8位无符号数字 以下是数字和二进制
什么是JS中不会出现的短整数溢出情况(可能是伪代码)?假设您有一个8位无符号数字 以下是数字和二进制表示的选择: 1:00000001 2:00000010 15:00001111 255:11111111 如果你有255,加上1,会发生什么?没有更多的碎片了,所以它绕到 0:00000000 下面是一个使用uint(一个无符号32位整数)的C#演示 这是javascript中没有的问题
你会遇到不同的问题 例如:
var n=9007199254740991;
var m=n+1;
var p=m+1;
警报('n='+n+'和m='+m+'和p='+p)整数可以是-(2^53-1)到(2^53-1)。。实际上是一个有符号的54位整数(但不是真正的整数,但这并不相关)。。。短整数是16位。。。54位大于16位。。。所以没有溢出问题签名短的示例。。。32767+1在JS中是32768,在其他语言中是-32768@JaromandaX ... 那应该是-(2^53+1)
?我不知道…只是好奇而已。@rnevius-不,我说得对-基本上是+/-(2^53-1)@JaromandaX在这个范围之外也有很多整数可以表示(大多数可表示的整数都在这个范围之外),但这是所有整数都可以表示的最大范围。
using System;
public class Program
{
public static void Main()
{
uint n = 4294967294;
for(int i = 0; i < 4; ++i)
{
n = n + 1;
Console.WriteLine("n = {0}", n);
}
}
}
n = 4294967294
n = 4294967295
n = 0
n = 1