Подтвердить что ты не робот

Как избежать мелкого целочисленного переполнения в Javascript

Я читаю книгу Дугласа Крокфорда - Javascript - хорошие части - и он говорит:

JavaScript имеет один тип номера. Внутренне он представлен как 64-битная плавающая точка, так же, как Javas double. В отличие от большинства других языков программирования, нет отдельного целочисленного типа, поэтому 1 и 1.0 имеют одинаковое значение. Это является существенным удобством, потому что полностью исключаются проблемы переполнения в коротких целых числах...

Я не слишком хорошо знаком с другими языками, поэтому хотел бы немного пояснить. Я могу понять, почему 64 бит помогает, но его утверждение, похоже, относится к отсутствию поплавков и удвоений.

Что может быть (например, псевдокод) примером ситуации с коротким целым переполнением, которая не встречается в JS?

4b9b3361

Ответ 1

Предположим, у вас было 8-битное беззнаковое число.

Ниже представлен выбор цифровых и двоичных представлений:

1: 00000001

2: 00000010

15: 00001111

255: 11111111

Если у вас есть 255 и добавить 1, что произойдет? Там больше нет бит, поэтому он обтекает до

0: 00000000

Здесь демонстрация в С# с использованием uint (32-разрядное целое без знака)

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

Это проблема, которую вы не получаете в javascript.


У вас разные проблемы.

Например:

var n = 9007199254740991;
var m = n + 1;
var p = m + 1;
alert('n = ' + n + ' and m = ' + m + ' and p = ' + p);