Rang de conversion de nombre entier signé et non signé

Par exemple, si j’ai,

int a = 42; unsigned b = 10; int c = a + b; 

Pour cette déclaration, int c = a + b; Est-ce a sera d’abord converti en un unsigned int ou est-ce que b sera converti en un unsigned int signed int ? Les unsigned int signed et signed ont le même rang de conversion. Comment savoir lequel sera converti? Y a-t-il une règle standard?

Réponse courte: Selon C99 6.3.1.8-p1, a valeur s sera convertie en un unsigned int par, conformément à C99 6.3.1.3-p2, en ajoutant UINT_MAX + 1 jusqu’à ce que la valeur permise par unsigned int . Comme il se trouve déjà dans cette plage, aucun ajout ne sera effectué. En C99 6.3.1.3-p3, les résultats affectés à int c seraient définis par la mise en œuvre si (p1) et (p2) ne s’appliquaient pas. Mais dans ce cas, notez la clause “value” de 6.3.1.3-p1. La valeur (52) dans ce cas peut être représentée par int , elle n’est donc pas modifiée et définie.

C99 6.3.1.3 Entiers signés et non signés

  1. Lorsqu’une valeur de type entier est convertie en un type entier autre que _Bool, si la valeur peut être représentée par le nouveau type, elle est inchangée.

  2. Sinon, si le nouveau type est non signé, la valeur est convertie en ajoutant ou en soustrayant de manière répétée une valeur de plus que la valeur maximale pouvant être représentée dans le nouveau type jusqu’à ce que la valeur se situe dans la plage du nouveau type.60)

  3. Sinon, le nouveau type est signé et la valeur ne peut pas y être représentée. soit le résultat est défini par l’implémentation, soit un signal défini par l’implémentation est généré.

C99 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.62)

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é.