Conversion de type entier implicite en C

Je comprends les conversions implicites du langage C entre les types à nombre entier et à virgule flottante, mais j’ai une question à poser pour les conversions de types implicites signés / non signés.

Si vous ajoutez, par exemple, un caractère unsigned char et un unsigned char signed int , quel sera le type résultant? Serait-ce un unsigned int , un signed int , ou autre chose?

Je ne vois rien de spécifique dans la norme ANSI C99 à ce sujet, donc toute aide est la bienvenue.

En C99, la référence est 6.3.1.8 “Conversions arithmétiques usuelles”.

De nombreux opérateurs qui attendent des opérandes de type arithmétique provoquent des conversions et génèrent des types de résultat de manière similaire. Le but est de déterminer un type réel commun pour les opérandes et le résultat. Pour les opérandes spécifiés, chaque opérande est converti, sans changement de type de domaine, en un type dont le type réel correspondant est le type réel commun. Sauf indication explicite contraire, le type réel commun est également le type réel correspondant du résultat, dont le domaine de type correspond au domaine de type des opérandes s’ils sont identiques et complexes sinon. Ce modèle s’appelle les conversions arithmétiques habituelles:

  • Premièrement, si le type réel correspondant de l’un ou l’autre opérande est long double , l’autre opérande est converti, sans changement de type domaine, en un type dont le type réel correspondant est long double .
  • Sinon, si le type réel correspondant de l’un ou l’autre opérande est double , l’autre opérande est converti, sans changement de type domaine, en un type dont le type réel correspondant est double .
  • Sinon, si le type réel correspondant de l’un ou l’autre opérande est float , l’autre opérande est converti, sans changement de type domaine, en un type dont le type réel correspondant est float . 51)
  • Sinon, les promotions sur les entiers sont effectuées sur les deux opérandes. Ensuite, les règles suivantes sont appliquées aux opérandes promus:
    • Si les deux opérandes ont le même type, aucune conversion supplémentaire n’est nécessaire.
    • Sinon, si les deux opérandes ont des types entiers signés ou que les deux ont des types entiers non signés, l’opérande ayant le type de rang de conversion de nombre entier inférieur est converti en type de l’opérande avec le rang le plus élevé.
    • Sinon, si l’opérande qui a un type entier non signé a un rang supérieur ou égal au rang du type de l’autre opérande, l’opérande avec le type entier signé est converti au type de l’opérande avec le type entier non signé.
    • Sinon, si le type de l’opérande avec le type entier signé peut représenter toutes les valeurs du type de l’opérande avec le type entier non signé, l’opérande avec le type entier non signé est converti en type de l’opérande avec le type entier signé.
    • Sinon, les deux opérandes sont convertis en un type entier non signé correspondant au type de l’opérande avec un type entier signé.

Addition effectue les conversions arithmétiques habituelles. Ainsi, lors de l’ajout de unsigned char signed int et signed int , soit:

  • d’abord, le caractère unsigned char est promu en int , puis les deux types sont identiques, de sorte que le résultat est de type int , ou
  • (inhabituel) int ne peut pas représenter toutes les valeurs possibles des caractères unsigned char . Dans ce cas, unsigned char est promu en unsigned int et la troisième sous-puce s’applique: unsigned int a le même rang que int , ainsi l’opérande int est converti en unsigned int et le résultat est de type unsigned int .

Ce sera presque certainement un singed int et cela dépend du système où le code est exécuté. Vérifiez le paragraphe Promotion intégrale ici

unsigned char ou unsigned short peuvent être convertis en int si elle peut contenir toute sa plage de valeurs, et unsigned int sinon.

Sur un système POSIX par exemple, il s’agira certainement d’un signed int car un caractère est toujours composé de 8 bits et un int au moins 16 bits. Par conséquent, un int peut représenter chaque valeur possible d’un caractère unsigned char . Il y a apparemment des systèmes où char est plus que 8bits.