Maison >développement back-end >C++ >Pourquoi (1 >> 32) renvoie-t-il 1 en C : une plongée approfondie dans le comportement de l'opérateur de décalage à droite et le comportement non défini ?
32) Retour 1 en C : une plongée approfondie dans le comportement de l'opérateur de décalage à droite et le comportement non défini ? " />
Curiosité entourant l'opérateur de déplacement vers la droite (>> 32)
Lors de l'utilisation de l'opérateur de déplacement vers la droite (>>) dans Dans le code C, on suppose souvent qu'un décalage d'une valeur supérieure ou égale à la largeur de l'opérande entraînera zéro. Cependant, comme le démontre l'extrait de code fourni, cette hypothèse peut conduire à un comportement inattendu.
. La fonction foo(a, b) décale l'entier a de b bits. Lorsqu'elle est appelée avec les arguments (1, 32), elle renvoie étonnamment 1 au lieu du 0 attendu. Ce comportement provient du fait que le compilateur traite l'expression constante 1 >> 32 au moment de la compilation, où elle est évaluée à 0 en raison du comportement non défini décrit dans la norme C.
En revanche, la fonction bar(a, b) fonctionne sur un entier non signé de 64 bits et renvoie correctement 0 lors d'un décalage de 32 bits. En effet, 64 est supérieur à 32, ce qui garantit que le décalage produira 0. Cependant, même pour la barre, un décalage de 64 bits peut toujours renvoyer 1.
Pour mieux comprendre ce comportement, l'implémentation matérielle de l'opération de décalage masque le compte de décalage à 5 ou 6 bits (selon l'architecture), tronquant efficacement tout compte de décalage supérieur ou égal à 32 ou 63. Par conséquent, le décalage logique à droite (LSR) sur certaines architectures garantit que des décalages de ≥32 produiront toujours zéro.
Cela met en évidence la nature non portable du décalage d'un entier de 32 bits de ≥32, car le résultat peut varier en fonction de l'implémentation matérielle sous-jacente.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!