Comportement incohérent de l'opérateur de décalage vers la droite
L'opérateur de décalage vers la droite (>>) présente un comportement particulier lorsqu'il est appliqué à des entiers 32 bits avec un nombre de décalages supérieur ou égal à 32. Cette incohérence se produit en fonction des facteurs suivants :
Évaluation au moment de la compilation par rapport à l'exécution de l'exécution
Dans le code fourni, les expressions 1 >> 32 et (int)1 >> (int)32 sont évalués au moment de la compilation, conduisant à des résultats différents de ceux de la fonction foo(). Le compilateur optimise l'expression constante à 0, tandis que la fonction foo() évalue l'expression au moment de l'exécution, ce qui entraîne un comportement indéfini.
Comportement non défini dans la norme C
Le comportement de décalage d'un entier d'une valeur supérieure ou égale à la largeur de l'entier n'est pas défini selon la norme C 98. Par conséquent, le compilateur est libre d'interpréter l'expression 1 >> 32 comme bon lui semble.
Masquage du nombre de décalages sur les architectures x86
Sur les architectures x86/x86-64, le décalage logique vers la droite (SHR) se comporte comme un > ;> (b % 32) ou un >> (b % 64) en mode 64 bits. Ce masquage garantit que le nombre de décalages est limité à 5 ou 6 bits, ce qui entraîne un décalage de 0 à 31 (ou de 0 à 63 en mode 64 bits).
Extension zéro sur les architectures ARM
Contrairement au x86, le décalage logique vers la droite (LSR) sur les architectures ARM étend l'entier avec des zéros pendant le décalage. Cette extension garantit qu'un décalage de ≥32 produira zéro.
Implication pour la portabilité
L'incohérence dans le comportement de l'opérateur de décalage de droite à travers les architectures nécessite une attention particulière lors du développement code destiné à la portabilité. Le décalage des entiers 32 bits de ≥32 n'est pas recommandé en raison de son comportement indéfini ou dépendant de la machine.
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!