Condividi tramite


Conversioni numeriche predefinite (riferimenti per C#)

C# fornisce un set di tipi numerici integrali e a virgola mobile . Esiste una conversione tra due tipi numerici, impliciti o espliciti. È necessario usare un'espressione cast per eseguire una conversione esplicita.

Conversioni numeriche implicite

La tabella seguente illustra le conversioni implicite predefinite tra i tipi numerici predefiniti:

Da Per
sbyte short, int, long, floatdouble, , decimal, onint
byte short, ushort, , uint, longulong, float, doubledecimal, , , ninto intnuint
breve int float, long, , doubleo decimalonint
ushort int, uint, , ulongfloat, double, o decimal, ninto longnuint
int long, float, doubleo decimal, nint
uint long float, ulong, , doubleo decimalonuint
long float, double o decimal
ulong float, double o decimal
float double
nint long, float, doubleo decimal
nuint ulong, float, doubleo decimal

Annotazioni

Le conversioni implicite da , , ulong, , nint, o nuint a float e da long, ulong, ninto nuint a double possono causare una perdita di precisione, ma mai una perdita di ordine di grandezza. longuintint Le altre conversioni numeriche implicite non perdono mai informazioni.

Si noti anche che

  • Qualsiasi tipo numerico integrale è convertibile in modo implicito in qualsiasi tipo numerico a virgola mobile.

  • Non esistono conversioni implicite nei byte tipi e sbyte . Non esistono conversioni implicite dai double tipi e decimal .

  • Non esistono conversioni implicite tra il decimal tipo e i float tipi o double .

  • Un valore di un'espressione costante di tipo int (ad esempio, un valore rappresentato da un valore letterale integer) può essere convertito in modo implicito in sbyte, shortbyte, nintulongushortuinto nuint, se è compreso nell'intervallo del tipo di destinazione:

    byte a = 13;
    byte b = 300;  // CS0031: Constant value '300' cannot be converted to a 'byte'
    

    Come illustrato nell'esempio precedente, se il valore costante non rientra nell'intervallo del tipo di destinazione, si verifica un errore del compilatore CS0031 .

Conversioni numeriche esplicite

La tabella seguente illustra le conversioni esplicite predefinite tra i tipi numerici predefiniti per i quali non è presente alcuna conversione implicita:

Da Per
sbyte byte, ushort, uint, ulong o nuint
byte sbyte
breve sbyte, , byteushort, uint, ulongonuint
ushort sbyte, byte o short
int sbyte, byte, short, ushortuint, , ulong, onuint
uint sbyte, , byteshort, ushort, intonint
long sbyte, byte, , ushort, intuint, ulong, ninto shortnuint
ulong sbyte, byte, , ushort, intuint, long, ninto shortnuint
float sbyte, byte, , ushort, intuint, long, ulongdecimal, , , ninto shortnuint
doppio sbyte short, byte, , ushortint, uint, long, ulong, float, decimal, nint, onuint
decimal sbyte short, byte, , ushortint, uint, long, ulong, float, double, nint, onuint
nint sbyte, byte, , ushortint, uint, ulongo shortnuint
nuint sbyte, byte, , ushortint, uint, longo shortnint

Annotazioni

Una conversione numerica esplicita può comportare la perdita di dati o generare un'eccezione, in genere un oggetto OverflowException.

Si noti anche che:

  • Quando si converte un valore di un tipo integrale in un altro tipo integrale, il risultato dipende dal contesto di controllo dell'overflow. In un contesto controllato la conversione ha esito positivo se il valore di origine è compreso nell'intervallo del tipo di destinazione. In caso contrario, verrà generata un'eccezione OverflowException. In un contesto deselezionato, la conversione ha sempre esito positivo e procede come segue:

    • Se il tipo di origine è maggiore del tipo di destinazione, il valore di origine viene troncato rimuovendo i bit più significativi "extra". Il risultato viene quindi trattato come un valore del tipo di destinazione.

    • Se il tipo di origine è minore del tipo di destinazione, il valore di origine è esteso o esteso a zero in modo che corrisponda alla stessa dimensione del tipo di destinazione. L'estensione del segno viene usata se il tipo di origine è firmato; zero-extension viene usato se il tipo di origine non è firmato. Il risultato viene quindi trattato come un valore del tipo di destinazione.

    • Se il tipo di origine ha le stesse dimensioni del tipo di destinazione, il valore di origine viene considerato come valore del tipo di destinazione.

  • Quando si converte un decimal valore in un tipo integrale, questo valore viene arrotondato verso zero al valore integrale più vicino. Se il valore integrale risultante non è compreso nell'intervallo del tipo di destinazione, viene generata un'eccezione OverflowException .

  • Quando si converte un double valore o float in un tipo integrale, questo valore viene arrotondato verso zero al valore integrale più vicino. Se il valore integrale risultante non è compreso nell'intervallo del tipo di destinazione, il risultato dipende dal contesto di controllo dell'overflow. In un contesto controllato viene generata un'eccezione OverflowException , mentre in un contesto non selezionato, il risultato è un valore non specificato del tipo di destinazione.

  • Quando si esegue la conversione double in , il double valore viene arrotondato al valore più floatfloatvicino. Se il double valore è troppo piccolo o troppo grande per adattarsi al float tipo, il risultato è zero o infinito.

  • Quando si esegue la conversione float o double in decimal, il valore di origine viene convertito in decimal rappresentazione e arrotondato al numero più vicino dopo il 28° separatore decimale, se necessario. A seconda del valore di origine, può verificarsi uno dei risultati seguenti:

    • Se il valore di origine è troppo piccolo da rappresentare come , decimalil risultato diventa zero.

    • Se il valore di origine è NaN (non un numero), infinito o troppo grande da rappresentare come , viene generata un'eccezione decimalOverflowException .

  • Quando si esegue la conversione decimal in float o double, il valore di origine viene arrotondato rispettivamente al valore o double più float vicino.

Specificazione del linguaggio C#

Per altre informazioni, vedere le sezioni seguenti delle specifiche del linguaggio C#:

Vedere anche