Sono operandi all'interno di un'espressione promossi ai tipi più grandi in base alle seguenti regole?

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

Domanda

Se espressione numerica contiene operandi (costanti e variabili) di diversi tipi numerici, sono operandi promossi ai tipi grandi secondo le seguenti regole:

  1. se gli operandi sono di tipi byte, sbyte, char, short, ushort, ottengono convertito tipo int
  2. Se uno degli operandi è int, allora tutti gli operandi sono convertiti in int
  3. se espressione contiene anche operandi di tipi uint e int, quindi tutti gli operandi vengono convertiti long
  4. Se uno degli operandi è long, poi tutti gli operandi vengono convertiti in long
  5. se espressione contiene operandi di tipo ulong e long, poi vengono convertiti in float
  6. Se uno degli operandi è float, allora tutti gli operandi sono convertiti in float
  7. se uno degli operandi è double, allora tutti gli operandi sono convertiti in double

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
È stato utile?

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 bytes, in modo che il bytes devono prima essere promossi a ints.

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 tipo decimal, oppure un errore di compilazione si verifica se l'altro operando è di tipo float o double.
  •   
  • Altrimenti, se uno degli operandi è di tipo double, l'altro operando viene convertito nel tipo double.
  •   
  • Altrimenti, se uno degli operandi è di tipo float, l'altro operando viene convertito nel tipo float.
  •   
  • Altrimenti, se uno degli operandi è di tipo ulong, l'altro operando viene convertito nel tipo ulong, oppure un errore di compilazione si verifica se l'altro operando è di tipo sbyte, short, int o long.
  •   
  • Altrimenti, se uno degli operandi è di tipo long, l'altro operando viene convertito nel tipo long.
  •   
  • Altrimenti, se uno degli operandi è di tipo uint e l'altro operando è di tipo sbyte, short o int, entrambi gli operandi vengono convertiti tipo long.
  •   
  • Altrimenti, se uno degli operandi è di tipo uint, l'altro operando viene convertito nel tipo uint.
  •   
  • 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top