"Имитировать" 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 не имеет его (типичного). Вам нужно будет вернуться к подкладке, например этот.