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.