Contrainte par les opérateurs de bits
Mise à jour : novembre 2007
Les opérateurs de bits dans cette version de JScript sont entièrement compatibles avec les opérateurs de bits des précédentes versions de JScript. En outre, les opérateurs JScript peuvent également être utilisés sur les nouveaux types de données numériques. Le comportement des opérateurs de bits dépend de la représentation binaire des données. Par conséquent, il est important de comprendre comment les opérateurs forcent la conversion des types des données.
Il est possible de passer trois types d'arguments à des opérateurs de bits : des variables à liaison anticipée, des variables à liaison tardive et des données littérales. Les variables à liaison anticipée sont des variables définies avec une annotation de type explicite. Quant aux variables à liaison tardive, ce sont des variables de type Object qui contiennent des données numériques.
Opérateurs de bits AND (&), OR (|) et XOR (^)
Si l'un des opérandes est une variable à liaison tardive ou si les deux sont des littéraux, les deux opérandes sont alors convertis en int (System.Int32), l'opération est effectuée et la valeur de retour est de type int.
Si les deux opérandes sont des variables à liaison anticipée ou si l'un d'eux est un littéral et l'autre une variable à liaison anticipée, l'opération exige davantage d'étapes. Les deux opérandes sont convertis en un type déterminé par deux conditions :
Si aucun des deux opérandes n'est un entier, les deux opérandes sont convertis en int.
Si seul un opérande est un entier, l'autre est converti en type entier ou en int (en fait, vers le plus long des deux types).
Si un opérande est plus long, le type vers lequel l'opérande est converti a alors la même longueur que l'opérande le plus long.
Si l'un ou l'autre opérande n'est pas signé, alors le type vers lequel l'opérande est converti n'est pas signé. Sinon, le type converti est signé.
Les opérandes sont ensuite convertis vers le type approprié, l'opération de bits est effectuée et le résultat retourné. Le type de données du résultat est identique au type des opérandes convertis.
Lorsque vous utilisez un littéral entier avec un opérateur de bits et une variable à liaison anticipée, le littéral est interprété comme un type int, long, ulong ou double, en fonction du plus petit type qui peut représenter le nombre. Les valeurs décimales littérales sont converties en type double. Le type de données du littéral peut encore faire l'objet d'autres contraintes, ou conversions, selon les règles décrites ci-dessus.
Opérateur de bits NOT (~)
S'il s'agit d'un opérande à liaison tardive, à virgule flottante ou littéral, il est converti en int (System.Int32), l'opération NOT est effectuée et la valeur de retour est de type int.
Si l'opérande est un type de données entier à liaison anticipée, l'opération NOT est effectuée et le type du retour est identique au type de l'opérande.
Opérateurs de bits Décalage vers la gauche (<<) et Décalage vers la droite (>>)
Si l'opérande de gauche est une variable à liaison tardive, à virgule flottante ou un littéral, il est converti en int (System.Int32). Sinon, l'opérande de gauche est un type de données entier à liaison anticipée et aucune contrainte (conversion) n'est appliquée. L'opérande de droite est toujours converti en type de données entier. L'opération de décalage est ensuite effectuée sur les valeurs converties et le résultat retourné a le même type que l'opérande de gauche (s'il s'agit d'un opérande à liaison anticipée) ou le type int.
Opérateurs Décalage vers la droite non signé (>>>)
Si l'opérande de gauche est une variable à liaison tardive, à virgule flottante ou un littéral, il est converti en uint (System.UInt32). Sinon, l'opérande de gauche est un type de données entier à liaison anticipée et il est converti en type non signé de la même taille. Par exemple, un type int serait converti en uint. L'opérande de droite est toujours converti en type de données entier. L'opération de décalage est ensuite effectuée sur les valeurs converties et le résultat retourné a le même type que l'opérande de gauche converti (s'il s'agit d'un opérande à liaison anticipée) ou le type uint.
Le résultat d'un décalage vers la droite non signé est toujours suffisamment petit pour pouvoir être stocké dans la version signée du type de retour sans dépassement de capacité.