Conversión realizada por operadores bit a bit
Actualización: noviembre 2007
Los operadores bit a bit de esta versión de JScript son totalmente compatibles con los operadores bit a bit de las versiones anteriores de JScript. Asimismo, los operadores de JScript pueden utilizarse también en los nuevos tipos de datos numéricos. El comportamiento de los operadores bit a bit depende de la representación binaria de los datos, por lo que es importante comprender cómo los operadores convierten los tipos de datos.
A los operadores bit a bit se pueden pasar tres tipos de argumentos: variables de enlace en tiempo de compilación, variables de enlace en tiempo de ejecución y datos literales. Las variables de enlace en tiempo de compilación son aquéllas definidas con una anotación de tipo explícita. Las variables de enlace en tiempo de ejecución son variables de tipo Object que contienen datos numéricos.
Operadores AND (&), OR (|) y XOR (^) bit a bit
Si alguno de los operandos es de enlace en tiempo de ejecución, o si ambos operandos son literales, los dos operandos se convierten en int (System.Int32), se realiza la operación y se devuelve el valor int.
Si ambos operandos son de enlace en tiempo de compilación, o si uno es un literal y el otro un operando de enlace en tiempo de compilación, se realizan más operaciones. Ambos operandos se convierten en un tipo que viene determinado por dos condiciones:
Si ninguno de los operandos es integral, ambos operandos se convierten en int.
Si sólo uno de ellos es integral, el otro operando se convierte en el tipo integral o en int, el que sea mayor.
Si un operando es mayor que el otro, el tipo en que se convierte el operando tiene la misma longitud que el operando mayor.
Si alguno de los operandos no tiene signo, el tipo en el que se convierte el operando es sin signo. En caso contrario, el tipo en el que se convierte es con signo.
Los operandos se convierten entonces en el tipo correspondiente, se realiza la operación bit a bit y se devuelve el resultado. El tipo de datos del resultado es el mismo que el tipo de los operandos convertidos.
Cuando se utiliza un literal integral con un operador bit a bit y una variable de enlace en tiempo de compilación, el literal se interpreta como un int, long, ulong o double, dependiendo de cuál sea el tipo más pequeño que puede representar el número. Los valores decimal literales se convierten en double. El tipo de datos del literal puede sufrir otras conversiones en función de las reglas anteriormente descritas.
Operador NOT bit a bit (~)
Si el operando es de enlace en tiempo de ejecución, de punto flotante o un literal, se convierte en int (System.Int32), se realiza la operación NOT y el valor devuelto es un int.
Si el operando tiene un tipo de datos integral de enlace en tiempo de compilación, se realiza la operación NOT y el tipo de valor devuelto es el mismo que el tipo del operando.
Operadores de desplazamiento a la izquierda (<<) o a la derecha (>>) bit a bit
Si el operando izquierdo es de enlace en tiempo de ejecución, de punto flotante o un literal, se convierte en un int (System.Int32). En caso contrario, el operando izquierdo tendrá un tipo integral de enlace en tiempo de compilación y no se realizará la conversión. El operando derecho se convierte siempre en un tipo de datos integral. A continuación, se ejecuta la operación de desplazamiento a la derecha en los valores convertidos y el resultado devuelto adopta el mismo tipo que el operando izquierdo (si es de enlace en tiempo de compilación) o el tipo int.
Operador de desplazamiento a la derecha sin signo (>>>)
Si el operando izquierdo es de enlace en tiempo de ejecución, de punto flotante o un literal, se convierte en un uint (System.UInt32). En caso contrario, el operador izquierdo tendrá un tipo de datos integral de enlace en tiempo de compilación y se convertirá en un tipo sin signo del mismo tamaño. Por ejemplo, un int se convertirá en un uint. El operando derecho se convierte siempre en un tipo de datos integral. A continuación se realiza la operación de desplazamiento a la derecha en los valores convertidos y el resultado devuelto adopta el mismo tipo que el operando izquierdo convertido (si es de enlace en tiempo de compilación) o el tipo uint.
El resultado del desplazamiento a la derecha sin signo es siempre lo suficientemente pequeño para almacenarse en la versión con signo del tipo de valor devuelto sin que se produzca desbordamiento.