如何在Javascript中避免小整数溢出

如何在Javascript中避免小整数溢出,javascript,Javascript,我正在读道格拉斯·克罗克福德的书《Javascript好的部分》,他说: JavaScript只有一个数字类型。在内部,它表示为64位浮点,与Java的双精度浮点相同。与大多数其他编程语言不同,没有单独的整数类型,因此1和1.0是相同的值。这是一个极大的便利,因为短整数中的溢出问题被完全避免了 我不太熟悉其他语言,所以我想解释一下。我能理解为什么64位有帮助,但他的说法似乎适用于缺少浮动和双精度 什么是JS中不会出现的短整数溢出情况(可能是伪代码)?假设您有一个8位无符号数字 以下是数字和二进制

我正在读道格拉斯·克罗克福德的书《Javascript好的部分》,他说:

JavaScript只有一个数字类型。在内部,它表示为64位浮点,与Java的双精度浮点相同。与大多数其他编程语言不同,没有单独的整数类型,因此1和1.0是相同的值。这是一个极大的便利,因为短整数中的溢出问题被完全避免了

我不太熟悉其他语言,所以我想解释一下。我能理解为什么64位有帮助,但他的说法似乎适用于缺少浮动和双精度


什么是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