Maison > développement back-end > C++ > Que se passe-t-il lorsque vous décalez vers la droite avec un nombre dépassant la largeur du texte en C ?

Que se passe-t-il lorsque vous décalez vers la droite avec un nombre dépassant la largeur du texte en C ?

Patricia Arquette
Libérer: 2024-11-03 02:40:29
original
849 Les gens l'ont consulté

What Happens When You Shift Right with a Count Exceeding Type Width in C  ?

Décalage vers la droite avec un nombre dépassant la largeur du type : comportement non défini

En C, l'opérateur de décalage vers la droite (>>) effectue une opération logique ou opérations de décalage arithmétique sur des entiers. Bien que le comportement de cet opérateur soit généralement bien défini, certaines conditions peuvent conduire à un comportement indéfini.

L'une de ces conditions est lorsque le nombre de décalages dépasse la largeur du type décalé. La norme C indique explicitement que "Le comportement n'est pas défini si l'opérande droit est négatif, ou supérieur ou égal à la longueur en bits de l'opérande gauche promu."

Cela implique que décaler un entier d'un nombre supérieur ou égal à sa largeur de bits n'est pas défini, que l'opérande soit signé ou non signé. En théorie, cela signifie que le résultat d'un tel changement n'est pas garanti et peut varier selon les différentes implémentations.

Cependant, en pratique, certains compilateurs peuvent implémenter un comportement spécifique dans de tels cas. Par exemple, GCC émet un avertissement lorsque le nombre de décalages dépasse la largeur du texte, mais ne génère pas d'erreur. Ce comportement n'est pas explicitement défini dans le standard C et peut varier selon les différentes plateformes.

Dans l'extrait de code fourni, un décalage vers la droite d'un entier non signé de 34 est effectué :

<code class="cpp">unsigned int val = 0x0FFFFFFF;
unsigned int res = val >> 34;</code>
Copier après la connexion

Le résultat calculé selon la norme C doit être 0, car le nombre de décalages est supérieur à la largeur du type int non signé (qui est généralement de 32 bits). Cependant, GCC donne un avertissement et calcule le résultat comme 67108863 à la place.

Cette divergence survient car GCC implémente un comportement spécifique pour ce cas non défini. Le code assembleur généré utilise l'instruction SHRL, qui effectue un décalage logique vers la droite et n'étend pas le résultat par signe. En conséquence, le résultat n'est pas nul mais plutôt une valeur non nulle.

Par conséquent, lorsque vous travaillez avec des opérations de décalage en C , il est crucial de s'assurer que le nombre de décalages ne dépasse pas la largeur du type étant décalé. Dépasser la largeur de type peut entraîner un comportement indéfini et des résultats peu fiables sur différents compilateurs et plates-formes.

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