Sono operandi all'interno di un'espressione promossi ai tipi più grandi in base alle seguenti regole?
-
28-09-2019 - |
Domanda
Se espressione numerica contiene operandi (costanti e variabili) di diversi tipi numerici, sono operandi promossi ai tipi grandi secondo le seguenti regole:
- se gli operandi sono di tipi
byte
,sbyte
,char
,short
,ushort
, ottengono convertito tipoint
- Se uno degli operandi è
int
, allora tutti gli operandi sono convertiti inint
- se espressione contiene anche operandi di tipi
uint
eint
, quindi tutti gli operandi vengono convertitilong
- Se uno degli operandi è
long
, poi tutti gli operandi vengono convertiti inlong
- se espressione contiene operandi di tipo
ulong
elong
, poi vengono convertiti infloat
- Se uno degli operandi è
float
, allora tutti gli operandi sono convertiti infloat
- se uno degli operandi è
double
, allora tutti gli operandi sono convertiti indouble
Supponendo espressioni numeriche contiene operandi di tipo diverso, saranno tutti gli operandi prima vengono convertiti in un unico tipo numerico, e solo allora il tentativo di esecuzione per calcolare il risultato? Ad esempio, se le variabili b1
e b2
sono di tipo byte
, mentre i1
è di tipo int
, si b1
e get
b2 convertito in int prima (b1+b2)
calcolo:
int i2=(b1+b2)+i1
Soluzione
Le parentesi sono di precedenza superiore +
, quindi la conversione normalmente avvenire dopo b1
e b2
sono stati aggiunti. Tuttavia, l'operatore +
non ha un sovraccarico per byte
s, in modo che il byte
s devono prima essere promossi a int
s.
Per ulteriori approfondimenti:
Altri suggerimenti
Le regole hanno alcuni elementi di verità, ma è tecnicamente impreciso.
Ecco gli estratti rilevanti dal linguaggio C # Specification
7.2.6.2 binari promozioni numerici
Binary promozione numerico si verifica per gli operandi degli operatori
+
,–
,*
,/
,%
,&
,|
,^
,==
,!=
,>
,<
,>=
, e<=
binari predefiniti. promozione numerico binario converte implicitamente entrambi gli operandi ad un tipo comune che, in caso di operatori non relazionali, diventa anche il tipo di risultato dell'operazione. promozione numerico binario consiste nell'applicare le regole seguenti, nell'ordine in cui appaiono qui:
- Se l'operando è di tipo
decimal
, l'altro operando viene convertito nel tipodecimal
, oppure un errore di compilazione si verifica se l'altro operando è di tipofloat
odouble
.- Altrimenti, se uno degli operandi è di tipo
double
, l'altro operando viene convertito nel tipodouble
.- Altrimenti, se uno degli operandi è di tipo
float
, l'altro operando viene convertito nel tipofloat
.- Altrimenti, se uno degli operandi è di tipo
ulong
, l'altro operando viene convertito nel tipoulong
, oppure un errore di compilazione si verifica se l'altro operando è di tiposbyte
,short
,int
olong
.- Altrimenti, se uno degli operandi è di tipo
long
, l'altro operando viene convertito nel tipolong
.- Altrimenti, se uno degli operandi è di tipo
uint
e l'altro operando è di tiposbyte
,short
oint
, entrambi gli operandi vengono convertiti tipolong
.- Altrimenti, se uno degli operandi è di tipo
uint
, l'altro operando viene convertito nel tipouint
.- Altrimenti, entrambi gli operandi vengono convertiti tipo
int
.
int i2=(b1+b2)+i1
Come per la specifica di cui sopra, sì, byte b1, b2
sono soggetti alla promozione numerico binario int
per la +
operatore binario.