Tracce
/
C#
C#
/
Programma
/
Numeri interi
Nu

Numeri interi in C#

7 esercizi

Informazioni su Numeri interi

C#, come molti linguaggi tipizzati staticamente, fornisce diversi tipi che rappresentano i numeri interi, ciascuno con il proprio intervallo di valori. All'estremo inferiore, il tipo sbyte ha un valore minimo di -128 e un valore massimo di 127. Come per tutti i tipi interi, questi valori sono disponibili come <type>.MinValue e <type>.MaxValue. All'estremo superiore, il tipo long ha un valore minimo di -9.223.372.036.854.775.808 e un valore massimo di 9.223.372.036.854.775.807. Nel mezzo si collocano i tipi short e int.

Ognuno dei tipi precedenti è abbinato a un equivalente senza segno: sbyte/byte, short/ushort, int/uint e long/ulong. In tutti i casi, l'intervallo dei valori va da 0 al massimo negativo con segno moltiplicato per 2 più 1.

I valori dei tipi interi senza segno sono rappresentati con una semplice rappresentazione in base 2. I valori dei tipi con segno usano la rappresentazione dei numeri con segno in complemento a due.

La molteplicità dei tipi interi riflette l'architettura delle macchine: la dimensione dei registri, la dimensione degli argomenti delle istruzioni della CPU e il trattamento del segno all'interno della CPU. Un valore di tipo long usa 64 bit, mentre un valore di tipo sbyte usa 8 bit. In alcuni casi ci saranno implicazioni sulle prestazioni della CPU, sull'uso della memoria e persino sull'uso del disco (dove in genere conviene scegliere un tipo intero più piccolo). Scegliere un type intero può anche essere un modo rapido e approssimativo per comunicare agli altri sviluppatori l'intervallo di valori previsto. Il tipo int è ampiamente usato come tipo predefinito quando non è stato identificato nulla di particolare nell'uso specifico. Il long o l'ulong è ampiamente usato come semplice identificatore. La dimensione del tipo in byte determina l'intervallo dei valori.

I tipi discussi finora sono tipi primitivi. Ognuno è abbinato a un alias struct che implementa campi (come MinValue) e metodi (come ToString()) associati al tipo.

Tipo Struct Larghezza Minimo Massimo
sbyte SByte 8 bit -128 +127
short Int16 16 bit -32_768 +32_767
int Int32 32 bit -2_147_483_648 +2_147_483_647
long Int64 64 bit -9_223_372_036_854_775_808 +9_223_372_036_854_775_807
byte Byte 8 bit 0 +255
ushort UInt16 16 bit 0 +65_535
uint UInt32 32 bit 0 +4_294_967_295
ulong UInt64 64 bit 0 +18_446_744_073_709_551_615

Casting

Una variabile (o un'espressione) di un tipo può essere convertita facilmente in un altro. Per esempio, in un'operazione di assegnazione, se il tipo del valore che viene assegnato (rhs) garantisce che il valore rientri nell'intervallo del tipo a cui si assegna (lhs), allora basta una semplice assegnazione:

ulong ul;
uint ui = uint.MaxValue;
ul = ui;    // no problem

D'altra parte, se l'intervallo del tipo da cui si assegna non è un sottoinsieme dell'intervallo di valori del tipo di destinazione, allora serve un'operazione di cast, (), anche se il valore specifico rientra nell'intervallo di destinazione:

uint ui;
short s = 42;
ui = (uint)s;

Nell'esempio precedente, se il valore fosse invece fuori dall'intervallo del tipo di destinazione, si verificherebbe un overflow. Vedi overflow.

L'esigenza di un cast è determinata dai due tipi coinvolti, non da un valore specifico.

I paragrafi seguenti trattano il casting dei tipi interi. La pagina casting fornisce una trattazione più ampia del casting e della conversione di tipo. Consulta quella documentazione per una trattazione della conversione tra tipi interi e numeri in virgola mobile, char e bool.

Casting dei tipi primitivi: implicito

Il sistema di tipi di C# è un po' più rigoroso di quello di C o di Javascript, e di conseguenza le operazioni di cast sono più limitate. Il casting implicito avviene tra due tipi numerici purché il tipo «di destinazione» possa preservare scala e segno del valore del tipo «di partenza».

Un cast implicito non è indicato da alcuna sintassi speciale.

Casting dei tipi primitivi: esplicito

Quando i tipi numerici non possono essere convertiti implicitamente, in genere puoi usare l'operatore di cast esplicito.

Quando il valore che stai convertendo non può essere rappresentato dal tipo «di destinazione», perché non è abbastanza ampio o c'è un conflitto di segno, può essere generata un'eccezione di overflow.

Casting dei tipi primitivi: esempi
int largeInt = Int32.MaxValue;
int largeNegInt = Int32.MinValue;
ushort shortUnsignedInt = ushort.MaxValue;

// implicit cast
int from_ushort = shortUnsignedInt;          // 65535
float from_int = largeInt;                   // -21474836E+09

// explicit cast
uint from_largeInt = (uint)largeInt;         // 2147483647
uint from_neg = (uint) largeNegInt;          // 2147483648 or OverflowException is thrown (if checked)

Conversione in bit

La classe BitConverter offre un modo comodo per convertire i tipi interi da e verso gli array di byte.

Riferimenti
Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda

Impara Numeri interi

La pratica è bloccata

Sblocca 5 altri esercizi per esercitarti su Numeri interi