Maison >développement back-end >C++ >Comment C gère-t-il la promotion des opérateurs binaires avec des signatures différentes ?

Comment C gère-t-il la promotion des opérateurs binaires avec des signatures différentes ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-02 08:00:13970parcourir

How Does C   Handle Binary Operator Promotion with Differing Signedness?

Promotion d'opérateur binaire lorsque le signe diffère

Lorsque les opérateurs binaires opèrent sur des opérandes avec des signatures différentes, la norme C fournit des directives spécifiques pour déterminer la promotion règles et le type résultant.

La section 5/9 de la norme décrit les « conversions arithmétiques habituelles » qui s'appliquent à ces opérateurs. Ces conversions suivent un ordre hiérarchique :

  1. Si l'un des opérandes est double long, les deux opérandes sont convertis en double long.
  2. Si l'un des opérandes est double, les deux opérandes sont convertis en double.
  3. Si l'un ou l'autre des opérandes est float, les deux opérandes sont convertis en float.
  4. Les promotions intégrales sont effectuées sur les deux opérandes.
  5. Si l'un des opérandes est long non signé, les deux opérandes sont convertis en long non signé.
  6. Si un opérande est long int et l'autre est un int non signé, déterminez si long int peut représenter tous valeurs de int non signé. Si tel est le cas, convertissez unsigned int en long int ; sinon, convertissez les deux opérandes en entier long non signé.
  7. Si l'un des opérandes est long, les deux opérandes sont convertis en long.
  8. Si l'un des opérandes n'est pas signé, les deux opérandes sont convertis en non signé.
  9. Sinon, les deux opérandes restent de type int.

Appliquer ces règles aux exemples de code fournis :

Exemple 1 :

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

Puisque unsigned int a priorité sur int à l'étape 5 des règles, tous les opérandes sont convertis en int non signé. Par conséquent, le résultat est de type unsigned int.

Exemple 2 :

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

Dans ce cas, les règles dictent que les deux opérandes doivent être convertis en unsigned int. Cependant, la valeur résultante (-1) ne peut pas être représentée dans un entier non signé. Par conséquent, le type de résultat de l'expression est défini par l'implémentation conformément au §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