Coerção de operadores bit a bit
Os operadores bit a bit nesta versão do JScript são totalmente compatíveis com os operadores bit a bit em versões anteriores do JScript. Além disso, os operadores de JScript, também podem ser usados em novos tipos de dados numéricos. O comportamento dos operadores bit a bit depende da representação binária de dados, portanto, é importante entender como os operadores de forçar os tipos de dados.
Três tipos de argumentos podem ser passados para operadores bit a bit: variáveis de early bound, variáveis de ligação tardia e dados literais. Early-bound variáveis são variáveis definidas com uma anotação de tipo explícito. As variáveis de ligação tardia são variáveis do tipo Object que contêm dados numéricos.
AND bit a bit (&) ou (|) e XOR operadores (^)
Se o operando é tardia ou se ambos os operandos são literais, então ambos os operandos são forçados para int (Int32), a operação é executada e o valor de retorno é um int.
Se os dois operandos forem early-bound, ou se um operando é literal e o outro é early-bound, mais etapas são executadas. Ambos os operandos são forçados a um tipo determinado por duas condições:
Se nenhum operando é integral, ambos os operandos são forçados para int.
Se houver apenas um operando integral, o operando de nonintegral é forçado para o tipo integral ou forçado para int, o tipo é mais longo.
Se um operando for maior, o tipo ao qual o operando é forçado tem o mesmo comprimento como o maior operando.
Se qualquer operador for assinado, o tipo ao qual o operando é forçado é assinado. Caso contrário, o tipo forçado é assinado.
Os operandos são então forçados para o tipo apropriado, a operação bit a bit e o resultado é retornado. O tipo de dados do resultado é o mesmo que o tipo dos operandos coagidos.
Ao usar um literal integral com um operador bit a bit e uma variável vinculada antecipadamente, o literal será interpretado como um int, longo, ulong, ou double, dependendo de qual é o menor tipo que pode representar o número. Literal decimal valores são forçados para double. O tipo de dados do literal poderá sofrer ainda mais a coerção, de acordo com as regras descritas acima.
NOT em operador (~)
Se o operando é tardia, ponto flutuante ou um literal forçado para int (Int32), a operação não é executada e o valor de retorno é um int.
Se o operando for o tipo de dados de early bound integral, a operação não é executada e o tipo de retorno é o mesmo que o tipo do operando.
Desvio à esquerda (<<), deslocamento à direita (>>) operadores
Se o operando esquerdo é a ligação tardia, ponto flutuante ou um literal forçado para uma int (Int32). Caso contrário, o operando esquerdo é o tipo de dados integral de early bound e nenhuma coerção é executada. O operando da direita sempre é forçado a um tipo de dados. A operação de shift, em seguida, é realizada nos valores coagidos e o resultado retornado tem o mesmo tipo de operando esquerdo (se early-bound) ou como um tipo de int.
Não assinado à direita (>>>) operadores
Se o operando esquerdo é a ligação tardia, ponto flutuante ou um literal forçado para uma uint (System. UInt32). Caso contrário, o operando esquerdo é o tipo de dados integral de early bound, e ele é forçado para um tipo não assinado do mesmo tamanho. Por exemplo, um int poderia ser forçado para uma uint. O operando da direita sempre é forçado a um tipo de dados. A operação de shift, em seguida, é executada nos valores coagidos e o resultado retornado tem o mesmo tipo de operando esquerdo coagido (se early-bound) ou como um tipo de uint.
O resultado do turno não assinado à direita sempre é pequeno o suficiente para ser armazenado na versão assinada do tipo de retorno sem estouro.