Em JavaScript, todas as variáveis inteiras são inteiros assinados por padrão.
Os inteiros assinados usam 31 bits para representar o valor do inteiro e o bit 32 para representar o sinal do inteiro 0 representa um número positivo e 1 representa um número negativo.
O intervalo de valores é de -2^31 - 2^31-1, que é -2147483648 a 2147483647.
Quando o JavaScript executa operações de bits, ele usa um tipo inteiro com sinal de 32 bits, o que significa que o resultado da conversão também é um tipo inteiro com sinal de 32 bits. Às vezes, resultados inesperados ocorrerão quando realizarmos a mudança. A seguir está uma comparação entre a linguagem C e JS.
Linguagem C
Copie o código do código da seguinte forma:
int não assinado a = 3774191835u;
int sem sinal b = a >> 2;
/* b == 943547958 */
JavaScript
Copie o código do código da seguinte forma:
var a = 3774191835;
var b = a >> 2;
/* b == -130193866 */
Como você pode ver, o JavaScript usa números inteiros assinados ao realizar operações de bits, portanto, obtemos resultados diferentes. Como resolver isso?
Podemos converter números assinados em JavaScript em números não assinados. Basta fazer a operação >>>0 shift.
É melhor não usar >>. É recomendado usar >>> porque o bit mais à esquerda será analisado como um bit de sinal. Quando o número exceder, ele será analisado como um número negativo.