Son operandos dentro de una expresión promovidos a tipos más grandes de acuerdo con las siguientes reglas?
-
28-09-2019 - |
Pregunta
Si expresión numérica contiene operandos (constantes y variables) de diferentes tipos numéricos, son operandos promovidos a tipos más grandes de acuerdo con las siguientes reglas:
- si los operandos son de tipos
byte
,sbyte
,char
,short
,ushort
, consiguen convertir al tipoint
- Si uno de los operandos es
int
, entonces todos los operandos se convierten aint
- si la expresión también contiene operandos de tipos
uint
yint
, entonces todos los operandos se convierten along
- Si uno de operandos es
long
, entonces todos los operandos se convierten along
- si expresión contiene operandos de tipo
ulong
ylong
, entonces operandos se convierten afloat
- Si uno de los operandos es
float
, entonces todos los operandos se convierten afloat
- si uno de operandos es
double
, entonces todos los operandos se convierten adouble
Si se asume expresiones numéricas contiene operandos de diferentes tipos, serán todos los operandos se convierten primero a un solo tipo numérico, y sólo entonces el intento de ejecución para calcular el resultado? Por ejemplo, si las variables b1
y b2
son de tipo byte
, mientras i1
es de tipo int
, se b1
y get
b2 convierte a int antes de (b1+b2)
Computing:
int i2=(b1+b2)+i1
Solución
Los paréntesis son de mayor precedencia que +
, por lo que la conversión normalmente tener lugar después se han añadido b1
y b2
. Sin embargo, el operador +
no tiene una sobrecarga para byte
s, por lo que los byte
s primero deben ser promovidos a int
s.
Más información:
Otros consejos
Sus reglas tienen algunos elementos de verdades, pero es técnicamente imprecisa.
Aquí están los extractos pertinentes de la especificación del lenguaje C #
7.2.6.2 binarios promociones numéricos
promoción numérica binaria se produce para los operandos de los operadores
+
,–
,*
,/
,%
,&
,|
,^
,==
,!=
,>
,<
,>=
, y<=
binarios predefinidos. promoción numérica binaria convierte implícitamente ambos operandos a un tipo común que, en el caso de los operadores no relacionales, también se convierte en el tipo de resultado de la operación. promoción numérica binaria consiste en aplicar las reglas siguientes, en el orden en que aparecen aquí:
- Si alguno de los operandos es de tipo
decimal
, el otro operando se convierte al tipodecimal
, o un error de tiempo de compilación se produce si el otro operando es defloat
tipo odouble
.- lo contrario, si alguno de los operandos es de tipo
double
, el otro operando se convierte al tipodouble
.- lo contrario, si alguno de los operandos es de tipo
float
, el otro operando se convierte al tipofloat
.- lo contrario, si alguno de los operandos es de tipo
ulong
, el otro operando se convierte al tipoulong
, o un error de tiempo de compilación se produce si el otro operando es de tiposbyte
,short
,int
, olong
.- lo contrario, si alguno de los operandos es de tipo
long
, el otro operando se convierte al tipolong
.- lo contrario, si alguno de los operandos es de tipo
uint
y el otro operando es de tiposbyte
,short
, oint
, ambos operandos se convierten a tipolong
.- lo contrario, si alguno de los operandos es de tipo
uint
, el otro operando se convierte al tipouint
.- Si no, los dos operandos se convierten a tipo
int
.
int i2=(b1+b2)+i1
De acuerdo con la especificación anterior, sí, byte b1, b2
están sujetos a promoción numérica binaria a int
para la +
operador binario.