Post

Operadores e Registradores

Registradores

O que acontece quando executamos um operador shift left ou right?

O que é movido não é o endereço de memória e sim o registrador. Primeiro o valor é copiado para o registrador eax (rax em 64bits) e o operador é aplicado no registrador. Somente depois disto o valor é devolvido ao endereço já modificado.

O perigo do operador shift

O seguinte código aparentemente deveria fazer a mesma coisa (mas não faz).

1
2
x += stick >> 12;
x += stick / 2 ^ 12;

Sempre que usamos shift right estamos movendo os bits para o direita preenchendo todos os bits possíveis do tamanho (ex.: 32bits integer). Isso seria o mesmo que dividir o valor por um grande número como no exemplo mostrado 2 ^ 12. Porém, sabemos que números negativos o bit mais significativo é o bit 1.

Se fizermos um shift right em um valor como 111001111001. O primeiro bit negativo garante que nunca chegaremos no número zero pois o bit mais significativo ainda será 1, resultado sempre em um número enorme negativo (não o número zero).

O problema é que se estivermos trabalhando com valores que dependende de -1 à 1 como o gamepad que possui nos eixos X e Y esses valores, nunca chegaremos no número zero.

Logo, sempre dê preferência a operações de divisão para evitar o flip de sinal no número inteiro.

Dicas do Visual Studio e C++

Para visualizar no watch um valor em binario podemos usar o ,b. Exemplo: eax,b irá mostrar na saída o registrador no formato binário.

Esta postagem está licenciada sob CC BY 4.0 pelo autor.