70 votes

Décalage à gauche avec un décompte négatif

Qu'est-ce qui se passe exactement ici?

a << -5

Évidemment, cela ne change pas correctement. Mais le livre que je lis se lit comme suit:

Sur une machine, cette expression effectue en réalité un décalage à gauche de 27 bits

Ma question est; Pourquoi? Qu'est-ce qui cause un décalage à gauche de 27 bits? Et que se passe-t-il exactement lorsqu’un changement de rapport est négatif? Je vous remercie.

82voto

Lundin Points 21616

Les entiers négatifs à droite représentent un comportement indéfini en langage C.

ISO 9899: 1999 6.5.7 Opérateurs de décalage binaire §3

Les promotions entières sont effectuées sur chacun des opérandes. Le type de résultat est celui de l'opérande gauche promu. Si la valeur de l'opérande de droite est négative ou est supérieure ou égale à la largeur de l'opérande de gauche promu, le comportement n'est pas défini .

18voto

Anand Points 124

Comme déjà répondu par d'autres membres, elle produit un comportement indéfini. Ce que je voudrais mentionner ici est que vous citer un extrait du livre ( "Sur une machine" ) semble être partielle. Il ne veut pas généraliser le comportement. Le livre peut également expliqué que le comportement n'est pas défini par la norme. BTW, j'étais juste en passant par "La Nouvelle Norme C - Économique et Culturel de Commentaire" et trouve cette déclaration :

Le processeur Intel Pentium SAL instruction (généré par gcc et Microsoft C++ pour évaluer gauche-quarts) n'utilise les cinq derniers bits de la maj montant

Cela explique pourquoi un décalage à gauche de -5, pourrait entraîner un décalage à gauche de 27 ( pour complément de 2 représentation des nombres négatifs )

11voto

Oli Charlesworth Points 148744

Le comportement n'est pas défini.

Dans l'arithmétique binaire 5 bits, le complément à deux -5 a la même représentation binaire que le signe non signé +27, ce qui explique probablement cette plateforme particulière.

0voto

arnorhs Points 6107

Si la valeur que vous décalez est une variable de 32 bits, le décalage de -5 passe dans une "boucle" et décale de 27 degrés. Le changement ne peut s'effectuer que de manière "non signée".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X