Maison > développement back-end > C++ > Pourquoi 1 >> 32 donne-t-il 1, mais 1 (uint64_t) >> 32 donne-t-il 0 ?

Pourquoi 1 >> 32 donne-t-il 1, mais 1 (uint64_t) >> 32 donne-t-il 0 ?

Linda Hamilton
Libérer: 2024-10-26 12:17:02
original
1103 Les gens l'ont consulté

Why Does 1 >> 32 Résultat en 1, Mais 1 (uint64_t) >> 32 Résultat en 0 ? 
32 Résultat en 1, Mais 1 (uint64_t) >> 32 Résultat en 0 ? " />

Comportement curieux de l'opérateur de décalage à droite : 1>> 32

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; }
Copier après la connexion

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
Copier après la connexion

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!

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