Sont opérandes dans une expression promu à des types plus grands selon les règles suivantes?
-
28-09-2019 - |
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:
- si opérandes sont des types
byte
,sbyte
,char
,short
,ushort
, ils se convertissent au typeint
- Si l'un des opérandes est
int
, alors tous les opérandes sont convertis enint
- si l'expression contient également opérandes de types
uint
etint
, tous les opérandes sont convertis enlong
- Si l'un des opérandes est
long
, alors tous les opérandes sont convertis enlong
- si l'expression contient opérandes de type
ulong
etlong
, puis opérandes sont convertis enfloat
- Si l'un des opérandes est
float
, alors tous les opérandes sont convertis enfloat
- si l'un des opérandes est
double
, alors tous les opérandes sont convertis endouble
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
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 byte
s, de sorte que les byte
s doivent d'abord être promu int
s.
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 typedecimal
, ou une erreur de compilation se produit si l'autre opérande est de typefloat
oudouble
.- Dans le cas contraire, si l'un des opérandes est de type
double
, l'autre opérande est convertie en typedouble
.- Dans le cas contraire, si l'un des opérandes est de type
float
, l'autre opérande est convertie en typefloat
.- Sinon, si l'un des opérandes est de type
ulong
, l'autre opérande est converti au typeulong
, ou une erreur de compilation se produit si l'autre opérande est de typesbyte
,short
,int
oulong
.- Dans le cas contraire, si l'un des opérandes est de type
long
, l'autre opérande est convertie en typelong
.- Dans le cas contraire, si l'un des opérandes est de type
uint
et l'autre opérande est de typesbyte
,short
ouint
, les deux opérandes sont convertis typelong
.- Dans le cas contraire, si l'un des opérandes est de type
uint
, l'autre opérande est convertie en typeuint
.- 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 +
.