Maison > Article > développement back-end > Pourquoi 1 >> 32 donne-t-il 1, mais 1 (uint64_t) >> 32 donne-t-il 0 ?
32 Résultat en 1, Mais 1 (uint64_t) >> 32 Résultat en 0 ? " />
Problème :
Dans un programme C, le décalage à droite l'opérateur présente un comportement étrange :
<code class="cpp">int foo(int a, int b) { return a >> b; } int main() { std::cout << "foo(1, 32): " << foo(1, 32) << std::endl; }
La sortie est 1, ce qui est inattendu puisque le résultat devrait théoriquement être 0. De plus, le comportement diffère en fonction des types d'arguments :
<code class="cpp">int bar(uint64_t a, int b) { return a >> b; } std::cout << "bar(1, 32): " << bar(1, 32) << std::endl; // Outputs 0
Explication :
Ce comportement provient du fait que l'opérateur de décalage droit fonctionne différemment selon la largeur du type de données sous-jacent. Pour les entiers 32 bits (int dans ce cas), le le décalage à droite est un décalage "logique", ce qui signifie qu'il remplit les bits libérés avec des zéros quelle que soit la valeur de b. Par conséquent, 1 >> est évalué à 1, car un décalage supérieur au nombre de bits n'a aucun effet. 🎜>Cependant, pour les entiers de 64 bits (uint64_t), le décalage vers la droite est un décalage "arithmétique", ce qui signifie qu'il remplit les bits libérés avec le même bit de signe que l'opérande puisque la valeur 1 a un bit de signe positif. , le résultat de 1 >> 32 est 0.
Optimisation du compilateur :
De plus, l'optimisation du compilateur joue un rôle. L'expression 1 >> 32 est une constante de compilation, qui permet au compilateur de la plier en 0 lors de la compilation. Cela diffère de l'évaluation dynamique de foo(1, 32) au sein de la fonction.Problème de portabilité :
Il est crucial de noter que ce comportement dépend de l'architecture. Sur certaines architectures, comme ARM, le décalage logique vers la droite est implémenté différemment que sur les processeurs x86/x86-64. Par conséquent, décaler un entier de 32 bits d'une valeur supérieure ou égale à 32 peut produire des résultats non portables.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!