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 ?

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 ?

Barbara Streisand
Libérer: 2024-10-27 13:48:01
original
783 Les gens l'ont consulté

Why Does (1 >> 32) Retour 1 en C : Une plongée approfondie dans le comportement des opérateurs de décalage à droite et les comportements non définis ? 
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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal