Pourquoi le décalage gauche n'est-il pas défini sur les valeurs négatives en C mais bien défini en C ?
Les normes ISO C99 et C spécifient un comportement distinct pour les opérations de décalage à gauche sur des valeurs négatives. En C, le déplacement d'une valeur négative invoque un comportement non défini (UB) conformément à la section 6.5.7/4 de la norme ISO C99. Cela est dû au fait que la définition n'indique clairement le résultat que pour les valeurs non négatives, laissant le comportement indéfini pour les valeurs négatives.
Cependant, la norme ISO C -03 (section 5.8/2) définit explicitement le comportement des types signés. . Si la valeur décalée peut être représentée dans le type de résultat, elle est renvoyée. Sinon, un comportement non défini est invoqué.
Pourquoi le comportement non défini pour le décalage gauche sur les négatifs ?
La définition ISO C99 de l'opération de décalage gauche ne précise pas ce qui se passe avec les bits de poids fort d'une valeur négative lorsqu'ils sont décalés. Cela laisse à la mise en œuvre le soin de décider quoi faire, ce qui peut entraîner des résultats différents ou incorrects. Pour garantir un comportement cohérent entre les compilateurs, le comportement non défini est le comportement par défaut.
Pourquoi le comportement défini par l'implémentation pour le décalage vers la droite sur les négatifs ?
Contrairement à l'opération de décalage vers la gauche , l'opération de décalage vers la droite n'a pas à gérer une troncature depuis la gauche. En conséquence, il est plus facile pour les implémentations de définir un comportement cohérent pour les valeurs négatives. Ce comportement peut varier selon le compilateur et le système, mais il est généralement soit arithmétique (similaire au décalage à droite signé en C ) soit logique (le résultat est zéro).
Conclusion
La raison du comportement différent des opérations de décalage gauche et droite sur des valeurs négatives en C et C est en grande partie due à la facilité de mise en œuvre. Le décalage à droite peut être défini de manière cohérente pour les valeurs négatives sans complexité significative, tandis que le décalage à gauche doit soit tronquer les bits, soit spécifier un résultat non portable, ce qui entraînerait un comportement incohérent entre les compilateurs.
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!