В JavaScript все целочисленные переменные по умолчанию являются целыми числами со знаком. Что это значит?
Целые числа со знаком используют 31 бит для представления значения целого числа, а бит 32 для представления знака целого числа: 0 представляет положительное число, а 1 представляет отрицательное число.
Диапазон значений составляет от -2^31 до 2^31-1, что составляет от -2147483648 до 2147483647.
Когда JavaScript выполняет битовые операции, он использует 32-битный целочисленный тип со знаком, что означает, что результатом преобразования также является 32-битный целочисленный тип со знаком. Иногда при выполнении смещения возникают неожиданные результаты. Ниже приводится сравнение языка C и JS.
язык Си
Скопируйте код кода следующим образом:
без знака int a = 3774191835u;
беззнаковое целое b = а >> 2;
/* б == 943547958 */
JavaScript
Скопируйте код кода следующим образом:
вар а = 3774191835;
вар б = а >> 2;
/* b == -130193866 */
Как видите, JavaScript использует целые числа со знаком при выполнении битовых операций, поэтому мы получаем разные результаты. Как это решить?
Мы можем конвертировать числа со знаком в JavaScript в числа без знака. Просто выполните операцию сдвига >>>0.
Лучше не использовать >>. Рекомендуется использовать >>>, поскольку крайний левый бит будет анализироваться как знаковый бит. При переполнении числа оно будет анализироваться как отрицательное число.