Maison >développement back-end >C++ >Comment les règles de promotion C déterminent-elles le type de retour des opérateurs arithmétiques binaires avec des types entiers mixtes signés et non signés ?

Comment les règles de promotion C déterminent-elles le type de retour des opérateurs arithmétiques binaires avec des types entiers mixtes signés et non signés ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-28 08:30:11832parcourir

How Do C   Promotion Rules Determine the Return Type of Binary Arithmetic Operators with Mixed Signed and Unsigned Integer Types?

Comment les règles de promotion régissent l'arithmétique des opérateurs binaires avec des types de signes mixtes

Considérez le code suivant :

int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;

Le L'opérateur calcule le résultat comme 2147483648, suggérant un int non signé comme type de retour. À l'inverse, dans le code suivant :

unsigned int us = 42;
int neg = -43;
int result = us + neg;

le résultat est -1, indiquant un type de retour int.

Résolution de la règle de promotion

Le C la norme définit des règles de promotion spécifiques pour les opérateurs binaires arithmétiques (C §5/9) :

  1. Si l'un ou l'autre des opérandes est long double, convertissez les deux en long double.
  2. Si l'un des opérandes est double, convertissez les deux en double.
  3. Si l'un ou l'autre des opérandes est float, convertissez les deux en float.
  4. Appliquer promotions intégrales aux deux opérandes.
  5. Si l'un ou l'autre des opérandes est long non signé, convertissez les deux en long non signé.
  6. Si l'un ou l'autre l'opérande est un entier long et l'autre un entier non signé, convertissez l'entier non signé en entier long si possible, sinon convertissez les deux en un entier long non signé.
  7. Si l'un des opérandes est long, convertissez les deux en entier long.
  8. Si l'un des opérandes n'est pas signé, convertissez les deux en non signé.
  9. Si les deux opérandes sont des entiers, aucune autre conversion se produire.

Implications pour les exemples

Dans les deux exemples, les règles de promotion aboutissent à un type non signé pour le calcul de l'opérateur.

Exemple 1 : max et one sont promus en unsigned int, ce qui entraîne un type de retour non signé int.

Exemple 2 : Les règles de promotion ne dictent pas de gagnant clair entre int et unsigned int. Cependant, le type non signé est sélectionné, ce qui entraîne un débordement non signé du résultat. Puisque le résultat est finalement attribué à un int, la valeur résultante n'est pas définie selon C §4.7/3.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn