2010-02-24 17 views
5

Estaba trabajando con operadores de cambio de bit (vea mi pregunta Bit Array Equality) y un usuario de SO señaló un error en mi cálculo de mi operando de cambio - estaba calculando un rango de [1,32] en lugar de [0,31] por un int. (! ¡Viva la comunidad SO)C# bit shift: ¿este comportamiento está en la especificación, es un error o es fortuito?

Al fijar el problema, que se sorprendió al encontrar el siguiente comportamiento:

-1 << 32 == -1 

De hecho, parecería que n << s es compilado (o interpretado por el CLR- -no revisé el IL) como n << s % bs(n) donde bs (n) = tamaño, en bits, de n.

lo que habría esperado:

-1 << 32 == 0 

parecería que el compilador se está dando cuenta de que está cambiando más allá del tamaño del objetivo y corregir su error.

Esto es puramente una cuestión académica, pero ¿alguien sabe si esto está definido en la especificación (no pude encontrar nada en 7.8 Shift operators), solo un hecho fortuito de comportamiento indefinido, o hay un caso en que esto podría producir un ¿error?

Respuesta

9

creo que la parte pertinente de la especificación es aquí:

Para los operadores predefinidos, el número de bits a desplazar se calcula como sigue:

  • Cuando el tipo de x es int u uint, la cuenta de turno está dada por bajo orden de cinco bits de conteo. En otras palabras, el recuento de turnos se calcula del recuento & 0x1F.

  • Cuando el tipo de x es largo o ulong, la cuenta de turno está dada por bajo orden de seis bits de conteo. En otras palabras, el recuento de turnos se calcula del recuento & 0x3F.

Si el valor de desplazamiento resultante es cero, los operadores de desplazamiento simplemente devuelven el valor de x.

El valor 32 es 0x20. La expresión 0x20 & 0x1F se evalúa como 0. Por lo tanto, el recuento de turnos es cero y no se realiza ningún cambio; la expresión -1 << 32 (o cualquier x << 32) simplemente devuelve el valor original.

+0

Ah, por supuesto. Lo leí, pero mi mente debe haber quedado en blanco. Tiene mucho sentido. ¡Gracias! –

Cuestiones relacionadas