Cette réponse s'adresse en grande partie à un commentaire fait par @RafaDowgird :
"La taille minimale des opérations est int." - Ce serait très étrange (qu'en est-il des architectures qui supportent efficacement les opérations opérations ?) Est-ce vraiment dans la spécification C++ ?
N'oubliez pas que la norme C++ contient la règle très importante du "as-if". Voir la section 1.8 : Exécution du programme :
3) Cette disposition est parfois appelée la règle "as-if", parce qu'une implémentation est libre de ne pas tenir compte d'une exigence de la norme du moment que le résultat est le même que si l'exigence avait été respectée, dans la mesure où que l'on peut déterminer à partir du comportement observable du programme.
Le compilateur ne peut pas définir un int
doit avoir une taille de 8 bits, même si elle est la plus rapide, puisque la norme impose une taille minimale de 16 bits. int
.
Par conséquent, dans le cas d'un ordinateur théorique avec des opérations super rapides sur 8 bits, la promotion implicite à int
pour l'arithmétique pourrait compter. Cependant, pour de nombreuses opérations, vous ne pouvez pas savoir si le compilateur a réellement effectué les opérations dans la précision d'un int
et ensuite converti en un char
à stocker dans votre variable, ou si les opérations ont été faites en char depuis le début.
Par exemple, considérez unsigned char = unsigned char + unsigned char + unsigned char
où l'addition déborderait (supposons une valeur de 200 pour chacun). Si vous passez à int
vous obtiendrez 600, qui sera ensuite implicitement converti en une valeur de unsigned char
ce qui revient à moduler 256, donnant ainsi un résultat final de 88. Si vous ne faisiez pas de telles promotions, vous devriez effectuer un enveloppement entre les deux premières additions, ce qui réduirait le problème de 200 + 200 + 200
a 144 + 200
soit 344, qui se réduit à 88. En d'autres termes, le programme ne connaît pas la différence, et le compilateur est donc libre d'ignorer le mandat d'effectuer des opérations intermédiaires en int
si les opérandes ont un rang inférieur à int
.
C'est vrai en général pour l'addition, la soustraction et la multiplication. Ce n'est pas vrai en général pour la division ou le modulus.
18 votes
Gardez à l'esprit
^
est XOR.18 votes
@int ^ float = erreur de compilation :)