"Имитировать" 32-битное целочисленное переполнение в JavaScript

JavaScript может обрабатывать следующую математику просто:

var result = (20000000 * 48271) % 0x7FFFFFFF;

Но в некоторых языках программирования это первое умножение int*int приводит к слишком большому значению для хранения в стандартном 32-битном целочисленном значении. Есть ли способ "имитировать" это в JavaScript и посмотреть, каким будет итоговый расчет, если умножение привело к переполнению целых чисел?

Ответ 1

Можно моделировать 32-разрядное целое, "злоупотребляя" побитовыми операторами, доступными в JavaScript (поскольку они могут возвращать только целые числа в пределах этого диапазона).

Для преобразования в подписанное 32-разрядное целое:

x = (a * b) | 0;

Для преобразования в беззнаковое 32-разрядное целое:

x = (a * b) >>> 0;

Ответ 2

В новых браузерах Math.imul(a,b) даст вам фактический 32-разрядный целочисленный умноженный результат, при этом переполнение произойдет так, как вы ожидали бы (это дает более низкую половину 64-битного результата как то, что он возвращает).

Однако, насколько я знаю, нет способа получить переполнение (верхние 32 бита), но модуль, который вы показали в своем ответе, избавляется от этой информации, поэтому я полагаю, что это не то, что вы хотите. Если они собирались сделать переполнение, они должны были бы разделить его на основе подписанных и неподписанных в любом случае.

Я знаю, что это работает в Chrome, Firefox и Opera, но не уверен в остальном, хотя довольно уверен, что IE не имеет его (типичного). Вам нужно будет вернуться к подкладке, например этот.