Sont opérandes dans une expression promu à des types plus grands selon les règles suivantes?

StackOverflow https://stackoverflow.com/questions/3080597

Question

Si l'expression numérique contient opérandes (constantes et variables) de différents types numériques, sont opérandes promus à des types plus grands selon les règles suivantes:

  1. si opérandes sont des types byte, sbyte, char, short, ushort, ils se convertissent au type int
  2. Si l'un des opérandes est int, alors tous les opérandes sont convertis en int
  3. si l'expression contient également opérandes de types uint et int, tous les opérandes sont convertis en long
  4. Si l'un des opérandes est long, alors tous les opérandes sont convertis en long
  5. si l'expression contient opérandes de type ulong et long, puis opérandes sont convertis en float
  6. Si l'un des opérandes est float, alors tous les opérandes sont convertis en float
  7. si l'un des opérandes est double, alors tous les opérandes sont convertis en double

En supposant des expressions numériques contient opérandes de types différents, seront tous les opérandes d'abord se convertir à un seul type numérique, et alors seulement l'essai d'exécution pour calculer le résultat? Par exemple, si les variables b1 et b2 sont de type byte, alors que i1 est de type int, sera b1 et b2 get converti en int avant de calculer (b1+b2):

int i2=(b1+b2)+i1
Était-ce utile?

La solution

Les parenthèses sont de priorité plus élevé que +, de sorte que la conversion devrait normalement avoir lieu après b1 et b2 ont été ajoutés. Cependant, l'opérateur + n'a pas une surcharge pour bytes, de sorte que les bytes doivent d'abord être promu ints.

Pour en savoir plus:

Autres conseils

Vos règles ont des éléments de vérités, mais est techniquement imprécise.

Voici les extraits pertinents du langage C # Spécification

  

7.2.6.2 binaires promotions numériques

     

Promotion numérique binaire se produit pour les opérandes des + prédéfinis, , *, /, %, &, |, ^, ==, !=, >, <, >= et opérateurs binaires de <=. promotion numérique binaire convertit implicitement les deux opérandes à un type commun qui, dans le cas des opérateurs non relationnels, devient également le type de résultat de l'opération. promotion numérique binaire consiste à appliquer les règles suivantes, dans l'ordre où ils apparaissent ici:

     
      
  • Si l'un des opérandes est de type decimal, l'autre opérande est convertie en type decimal, ou une erreur de compilation se produit si l'autre opérande est de type float ou double.
  •   
  • Dans le cas contraire, si l'un des opérandes est de type double, l'autre opérande est convertie en type double.
  •   
  • Dans le cas contraire, si l'un des opérandes est de type float, l'autre opérande est convertie en type float.
  •   
  • Sinon, si l'un des opérandes est de type ulong, l'autre opérande est converti au type ulong, ou une erreur de compilation se produit si l'autre opérande est de type sbyte, short, int ou long.
  •   
  • Dans le cas contraire, si l'un des opérandes est de type long, l'autre opérande est convertie en type long.
  •   
  • Dans le cas contraire, si l'un des opérandes est de type uint et l'autre opérande est de type sbyte, short ou int, les deux opérandes sont convertis type long.
  •   
  • Dans le cas contraire, si l'un des opérandes est de type uint, l'autre opérande est convertie en type uint.
  •   
  • Dans le cas contraire, les deux opérandes sont convertis type int.
  •   

  

int i2=(b1+b2)+i1

Comme par la spécification ci-dessus, oui, byte b1, b2 sont soumis à la promotion numérique binaire à int pour l'opérateur binaire +.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top