Si l'on considère le Raison d'être de la norme internationale sur les langages de programmation-C en section 6.3.1.8
Conversions arithmétiques habituelles il est dit ( l'accent est mis sur la mienne pour l'avenir ) :
Les règles de la norme pour ces conversions de celles de K&R : les modifications tiennent compte de l'ajout des et les règles de préservation de la valeur. La licence explicite était d'effectuer des calculs dans un type "plus large" qu'il n'est absolument nécessaire, car cela peut parfois produire un code plus petit et plus rapide, sans plus rapide, sans parler du fait que la bonne réponse est plus souvent obtenue. . Les calculs peuvent également être peuvent également être effectués dans un type "plus étroit" par la règle du "comme si" tant que le même résultat final est obtenu. résultat final est obtenu. La distribution explicite peut toujours être utilisée pour obtenir une valeur dans un type désiré
Section 6.3.1.8 de la projet de norme C99 couvre les Conversions arithmétiques habituelles qui s'applique aux opérandes des expressions arithmétiques, par exemple la section 6.5.6 Opérateurs additifs dit :
Si les deux opérandes sont de type arithmétique, la fonction u conversions sont effectués sur eux.
Nous trouvons un texte similaire dans la section 6.5.5 Opérateurs multiplicatifs également. Dans le cas d'un court l'opérande, d'abord l'opérande promotions sur les nombres entiers sont appliqués à partir de la section 6.3.1.1 Booléens, caractères et entiers qui dit :
Si un int peut représenter toutes les valeurs du type original, l convertie en int ; sinon, elle est co C'est ce qu'on appelle les promotions d'entiers . 48) Tous les autres types sont inchangés par les promotions d'entiers.
La discussion de la section 6.3.1.1
de la Raison d'être de la norme internationale sur les langages de programmation-C sur promotions sur les nombres entiers est en fait plus intéressante, je vais la citer de manière sélective car elle est trop longue pour être citée entièrement :
Les mises en œuvre se répartissent comme suit deux camps principaux qui peuvent être des caractères comme préservation des valeurs non signées et préservation des valeurs .
[...]
En approche de préservation non signée appelle à la promotion de la t en unsigned int. Il s'agit d'une règle simple, qui permet d'obtenir un indépendant de l'environnement d'exécution.
En approche de préservation de la valeur appelle à la promotion de l signed int si ce type peut représenter correctement toutes les valeurs de l'élément d'origine, et sinon à promouvoir ces types en unsigned int. Ainsi, si l'environnement d'exécution représente short comme quelque chose de plus petit que int, unsigned short devient int ; sinon il devient unsigned int. int non signé.
Cela peut avoir des résultats plutôt inattendus dans certains cas, par exemple Comportement incohérent de la conversion implicite entre les types non signés et les types signés plus grands démontre qu'il existe de nombreux autres exemples de ce type. Dans la plupart des cas, les opérations fonctionnent comme prévu.
7 votes
@Jefffrey La promotion intégrale fait partie des conversions arithmétiques habituelles.
short s=1, t=2; auto x = s+t;
puisx
est unint
.0 votes
Duplication possible de Que signifie "Taille naturelle" en C++ ?
0 votes
IMO : Il y avait très peu à gagner en obligeant un compilateur conforme à effectuer des calculs sur des nombres entiers sous la forme d'un nombre court (ou d'un caractère). En l'absence de demande, pourquoi l'exiger ?
3 votes
Maxshort + maxshort > maxshort
25 votes
@technosaurus cela n'expliquerait pas pourquoi
int
n'est pas promu àlong
(maxint + maxint > maxint).11 votes
Je ne comprends pas les votes négatifs sur cette question. C'est une bonne question avec une réponse intéressante. Quatre downvotes et aucun commentaire, c'est plutôt décourageant.
0 votes
S'il n'a pas été promu à l'échelon int, vous verrez de nombreuses questions telles que : pourquoi ?
int char i = 120; int j = i+i; int k = i << 11
n'aboutit pas à une valeur correcte, c'est ce que l'on appelle "ne pas mentionner la bonne réponse plus souvent" dans le raisonnement ci-dessous.1 votes
@dyp : Les règles du pourquoi
x
est un typeint
sont complètement différentes en C et en C++... ;-)0 votes
@Shoe : C'est vrai, mais le débordement intervient beaucoup plus tôt avec
short
qu'avecint
. Mais il s'agit là d'une preuve insuffisante ; une réponse satisfaisante à cette question nécessite une citation, si possible.