2013-07-26 8 views
0

Pourquoi l'expression (-1 >>> 32) dans Java est évaluée à -1 au lieu de 0 comme prévu? Le >>> -shift-opérateur doit remplir 0s précède, le résultat devrait avoir tous les bits à 0.(-1 >>> 32) == -1?

C'est bizarre, car il casse la sémantique de >>>: par exemple (-1 >>> x) a les x premiers bits mis à 0 pour tous 0 <= x <= 31. La seule exception (inattendue) est 32.

Est-ce un comportement intentionnel, un bogue ou une optimisation du compilateur (surmotivée)?

J'ai utilisé l'expression ~(-1 >>> x) pour étendre un masque de réseau cidr à son équivalent de 32 bits, mais il semble que les masques/32 doivent être traités séparément.

Répondre

1

Vérifiez this post.

Citation de l'auteur réponse Rasmus Faber

De la spécification du langage Java:

Si le type de l'opérande gauche promu est int, seuls les cinq bits inférieurs d'ordre du l'opérande de droite est utilisé comme distance de décalage . Tout se passe comme si l'opérande de droite était soumis à un opérateur logique bit logique & (§15.22.1) avec la valeur de masque 0x1f. La distance de décalage réellement utilisée est donc toujours comprise entre 0 et 31 inclus.

long en bref: en raison de opérandes limite de la plage, -1 >>> 32 est équivalente à -1 >>> 0 qui est -1.

+0

thx pour votre réponse et désolé de poster des questions en double. cela l'explique bien. – paranoid