Maison > développement back-end > C++ > Le décalage vers la gauche est-il un comportement de nombre négatif non défini en C mais bien défini en C ?

Le décalage vers la gauche est-il un comportement de nombre négatif non défini en C mais bien défini en C ?

Barbara Streisand
Libérer: 2024-12-24 20:13:17
original
972 Les gens l'ont consulté

Is Left Shifting a Negative Number Undefined Behavior in C but Well-Defined in C  ?

Comportement non défini : décalage vers la gauche avec opérande gauche négatif

Selon la norme ISO C99, l'opération de décalage vers la gauche au niveau du bit (<< ) appelle un comportement non défini lorsque l'opérande de gauche a une valeur négative. En effet, la norme exige que si l'opérande de gauche a un type signé et une valeur non négative, le résultat est le produit de l'opérande de gauche et 2 à la puissance du montant du décalage, réduit modulo un de plus que la valeur maximale représentable. dans le type de résultat. Sinon, le comportement n'est pas défini.

Comportement bien défini en C

Contrairement au C, C garantit un comportement bien défini pour les opérations de décalage à gauche avec des opérandes gauches négatifs . La norme ISO C -03 précise que le résultat est l'opérande gauche multiplié par 2 élevé à la puissance du montant du décalage, réduit modulo la valeur maximale représentable plus un. Ce comportement bien défini permet d'obtenir des résultats prévisibles même en cas de changement de valeurs négatives.

Justification du comportement bien défini de C

La décision du comité ISO C de définir le comportement pour les décalages à gauche avec des opérandes gauches négatifs était probablement motivé par le désir d'obtenir des résultats prévisibles dans divers scénarios, y compris la manipulation de bits et les nombres entiers. arithmétique.

Décalage vers la droite défini par l'implémentation avec un opérande gauche négatif

L'opération de décalage vers la droite au niveau du bit (>>) avec un opérande gauche négatif est définie par l'implémentation. Cela signifie que le comportement n'est pas spécifié par la norme et est laissé à la discrétion de l'implémenteur du compilateur. Cela dépend généralement de la plate-forme cible et de l'implémentation spécifique du compilateur.

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