Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I tipi numerici integrali rappresentano numeri interi. Tutti i tipi numerici integrali sono tipi valore. I tipi integrali sono tipi semplici e vengono inizializzati con valori letterali. Tutti i tipi numerici integrali supportano operatori aritmetici, logici bit per bit, confronto ed uguaglianza .
Il riferimento al linguaggio C# documenta la versione rilasciata più di recente del linguaggio C#. Contiene anche la documentazione iniziale per le funzionalità nelle anteprime pubbliche per la versione futura del linguaggio.
La documentazione identifica tutte le funzionalità introdotte nelle ultime tre versioni della lingua o nelle anteprime pubbliche correnti.
Suggerimento
Per trovare quando una funzionalità è stata introdotta per la prima volta in C#, vedere l'articolo sulla cronologia delle versioni del linguaggio C#.
Caratteristiche dei tipi integrali
C# supporta i tipi integrali predefiniti seguenti:
| Tipo/parola chiave C# | Intervallo | Misura | Tipo .NET |
|---|---|---|---|
sbyte |
Da -128 a 127 | Intero a 8 bit con segno | System.SByte |
byte |
Da 0 a 255 | Intero senza segno a 8 bit | System.Byte |
short |
Da -32.768 a 32.767 | Numero intero con segno a 16 bit | System.Int16 |
ushort |
da 0 a 65.535 | Intero senza segno a 16 bit | System.UInt16 |
int |
Da −2.147.483.648 a 2.147.483.647 | Intero con segno a 32 bit | System.Int32 |
uint |
da 0 a 4.294.967.295 | Intero senza segno a 32 bit | System.UInt32 |
long |
-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 | Intero con segno a 64 bit | System.Int64 |
ulong |
Da 0 a 18.446.744.073.709.551.615 | Intero senza segno a 64 bit | System.UInt64 |
nint |
Dipende dalla piattaforma (calcolata in fase di esecuzione) | Numero intero con segno a 32 o 64 bit | System.IntPtr |
nuint |
Dipende dalla piattaforma (calcolata in fase di esecuzione) | Intero senza segno (32-bit o 64-bit) | System.UIntPtr |
In tutte le righe della tabella, ad eccezione delle ultime due, ogni parola chiave di tipo C# dalla colonna all'estrema sinistra è un alias per il tipo .NET corrispondente. La parola chiave e il nome del tipo .NET sono intercambiabili. Ad esempio, le dichiarazioni seguenti dichiarano variabili dello stesso tipo:
int a = 123;
System.Int32 b = 123;
I nint tipi e nuint nelle ultime due righe della tabella sono numeri interi di dimensioni native. È possibile usare le nint parole chiave contestuali e nuint per definire interi di dimensioni native. Gli interi a dimensione nativa sono interi a 32 bit quando vengono eseguiti in un processo a 32 bit o interi a 64 bit quando vengono eseguiti in un processo a 64 bit. Usarli per scenari di interoperabilità, librerie di basso livello e per ottimizzare le prestazioni negli scenari in cui la matematica integer viene usata ampiamente.
I tipi Integer di dimensioni native vengono rappresentati internamente come tipi System.IntPtr .NET e System.UIntPtr. I nint tipi e nuint sono alias per i tipi sottostanti.
Il valore predefinito di ogni tipo integrale è zero, 0.
Ognuno dei tipi integrali ha MinValue proprietà e MaxValue che forniscono il valore minimo e massimo di tale tipo. Queste proprietà sono costanti in fase di compilazione, ad eccezione del caso dei tipi di dimensioni native (nint e nuint). Le proprietà MinValue e MaxValue vengono calcolate in fase di esecuzione per i tipi a dimensione nativa. Le dimensioni di questi tipi dipendono dalle impostazioni del processo.
Utilizzare la System.Numerics.BigInteger struttura per rappresentare un intero con segno senza limiti superiori o inferiori.
Valori letterali Integer
I valori letterali integer possono essere:
- decimal: senza prefisso
-
esadecimale: con il prefisso
0xo0X -
binary: con il prefisso
0bo0B
Il codice seguente illustra un esempio di ognuno di essi:
var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;
Nell'esempio precedente viene illustrato anche l'uso di _ come separatore di cifre . È possibile usare il separatore di cifre con tutti i tipi di valori letterali numerici.
Il suffisso determina il tipo di un valore letterale integer nel modo seguente:
Se il valore letterale non ha un suffisso, il compilatore assegna il tipo come primo dei tipi seguenti in cui il valore può essere rappresentato:
int,uint,long,ulong.Annotazioni
Il compilatore interpreta i valori letterali come valori positivi. Ad esempio, il valore letterale
0xFF_FF_FF_FFrappresenta il numero4,294,967,295deluinttipo, anche se ha la stessa rappresentazione bit del numero-1delinttipo. Se è necessario un valore di un determinato tipo, eseguire il cast di un valore letterale a tale tipo. Usare l'operatoreuncheckedse non è possibile rappresentare un valore letterale nel tipo di destinazione. Esempio:unchecked((int)0xFF_FF_FF_FF)genera-1.Se il valore letterale include il
Usuffisso ou, il compilatore assegna il tipo come primo dei tipi seguenti in cui può essere rappresentato il relativo valore:uint,ulong.Se il valore letterale include il
Lsuffisso ol, il compilatore assegna il tipo come primo dei tipi seguenti in cui può essere rappresentato il relativo valore:long,ulong.Annotazioni
È possibile usare la lettera minuscola
lcome suffisso. Tuttavia,lgenera un avviso del compilatore perché la letteralpuò essere confusa con la cifra1. UsareLper maggiore chiarezza.Se il valore letterale include uno dei
ULsuffissi ,LUuLUlLulUul, olu, il compilatore assegna il tipo come .ulong
Se il valore rappresentato da un valore letterale integer supera UInt64.MaxValue, si verifica un errore del compilatore CS1021 .
Se il compilatore determina il tipo di un valore letterale integer come int e il valore rappresentato dal valore letterale è compreso nell'intervallo del tipo di destinazione, il valore può essere convertito in modo implicito in sbyte, byteshort, ushort, uint, ulong, ninto nuint:
byte a = 17;
byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Come illustrato nell'esempio precedente, se il valore del valore letterale non rientra nell'intervallo del tipo di destinazione, si verifica un errore del compilatore CS0031 .
È anche possibile usare un cast per convertire il valore rappresentato da un letterale intero in un tipo diverso dal tipo determinato del letterale.
var signedByte = (sbyte)42;
var longVariable = (long)42;
Conversioni
È possibile convertire qualsiasi tipo numerico integrale in qualsiasi altro tipo numerico integrale. Se il tipo di destinazione può archiviare tutti i valori del tipo di origine, la conversione è implicita. In caso contrario, usare un'espressione cast per eseguire una conversione esplicita. Per ulteriori informazioni, vedere conversioni numeriche integrate.
Numeri interi con dimensioni native
I tipi integer di dimensioni native hanno un comportamento speciale perché l'archiviazione corrisponde alle dimensioni intere naturali nel computer di destinazione.
Per ottenere le dimensioni di un intero di dimensioni native in fase di esecuzione, usare
sizeof(). Tuttavia, il codice deve essere compilato in un contesto non sicuro. Per esempio:Console.WriteLine($"size of nint = {sizeof(nint)}"); Console.WriteLine($"size of nuint = {sizeof(nuint)}"); // output when run in a 64-bit process //size of nint = 8 //size of nuint = 8 // output when run in a 32-bit process //size of nint = 4 //size of nuint = 4È anche possibile ottenere il valore equivalente dalle proprietà statiche IntPtr.Size e UIntPtr.Size .
Per ottenere i valori minimo e massimo dei numeri interi di dimensioni native in fase di esecuzione, usare
MinValueeMaxValuecome proprietà statiche con lenintparole chiave enuint, come nell'esempio seguente:Console.WriteLine($"nint.MinValue = {nint.MinValue}"); Console.WriteLine($"nint.MaxValue = {nint.MaxValue}"); Console.WriteLine($"nuint.MinValue = {nuint.MinValue}"); Console.WriteLine($"nuint.MaxValue = {nuint.MaxValue}"); // output when run in a 64-bit process //nint.MinValue = -9223372036854775808 //nint.MaxValue = 9223372036854775807 //nuint.MinValue = 0 //nuint.MaxValue = 18446744073709551615 // output when run in a 32-bit process //nint.MinValue = -2147483648 //nint.MaxValue = 2147483647 //nuint.MinValue = 0 //nuint.MaxValue = 4294967295Anche se l'intervallo completo di e
nintpuò essere maggiore, le costanti in fase dinuintcompilazione sono limitate a un intervallo a 32 bit:- Per
nint: Int32.MinValue a Int32.MaxValue. - Per
nuint: UInt32.MinValue a UInt32.MaxValue.
- Per
Il compilatore fornisce conversioni implicite ed esplicite in altri tipi numerici. Per ulteriori informazioni, vedere conversioni numeriche integrate.
Non esiste una sintassi diretta per letterali interi di dimensioni native. Non esiste alcun suffisso per indicare che un valore letterale è un intero di dimensioni native, ad esempio
Lper indicare un oggettolong. Usare invece cast impliciti o espliciti di altri valori integer. Per esempio:nint a = 42 nint a = (nint)42;
Specificazione del linguaggio C#
Per altre informazioni, vedere le sezioni seguenti delle specifiche del linguaggio C#:
- tipi integrali
- Valori letterali integer
- Tipi integrali di dimensioni native
-
Numerico
IntPtreUIntPtr