1. Quali tipi di numeri esistono?
Nel programming lavoriamo sempre con i numeri — dall'età dell'utente al numero di stelle in una galassia o ai centesimi sul conto in banca. Ma compiti diversi richiedono tipi diversi di numeri: a volte serve memorizzare solo numeri interi, a volte — frazioni molto precise, e a volte servono numeri "senza meno".
Numeri interi (int e altri)
Numero intero — è un numero senza parte decimale.
In C# di solito si usa il tipo int, ma ci sono anche altre opzioni che si differenziano per dimensione e intervallo.
- int — il tipo "principale" per i numeri interi. Può contenere valori molto grandi (e piccoli), ma non occupa troppa memoria.
Per esempio, per contare i like, l'età, il numero di giorni in un anno quasi sempre si usa int. - long — si usa se i valori possono essere davvero grandi (tipo miliardi o trilioni).
Esempio: memorizzare il totale delle visualizzazioni su YouTube di tutta la storia. - short — tipo economico ma usato raramente. Va bene dove ci sono tanti piccoli valori uguali (tipo dati audio, componenti di colore).
- byte — per valori ancora più piccoli, soprattutto in grafica e nella gestione dei file, dove risparmiare memoria è importante.
Numeri decimali (double, float, decimal)
A volte bisogna lavorare con numeri che hanno una parte decimale. Tipo la temperatura dell'aria, la media di uno studente, il prezzo di un prodotto con i centesimi.
- double — è il tipo "di default" per memorizzare numeri decimali. Abbastanza preciso per la maggior parte dei calcoli (esempio: 3.1415926535…).
- float — tipo più leggero e meno preciso, si trova spesso in grafica o quando si lavora con grandi array di dati e serve risparmiare memoria.
- decimal — pensato per compiti finanziari e contabili, quando è importante la precisione fino ai centesimi, per evitare "perdite" dovute al modo in cui i numeri decimali vengono memorizzati. Per esempio, per il saldo del conto, il prezzo di un prodotto, il tasso di cambio.
Tipi numerici speciali
In C# ci sono tipi numerici aggiuntivi per casi particolari:
- uint, ulong, ushort — tipi "unsigned", permettono solo valori positivi, ma l'intervallo è il doppio rispetto ai loro analoghi "signed".
- sbyte — piccolo tipo signed (per memorizzare in modo compatto valori negativi e positivi da -128 a 127).
- BigInteger — se devi lavorare con numeri enormi che superano gli intervalli standard, tipo in cryptography o calcoli astronomici.
2. Numeri signed e unsigned
Tipo signed può memorizzare sia numeri positivi che negativi. Utile quando i valori possono essere "sia sopra che sotto zero": tipo temperatura, saldo del conto, altezza rispetto al livello del mare.
Tipo unsigned — solo zero e numeri positivi. Va bene quando il meno non può esserci — tipo il numero di persone in una stanza, i byte in un file, il tempo.
Esempio:
- int (signed): -10, 0, 50
- uint (unsigned): 0, 10, 1000
Usando un tipo unsigned, puoi mettere nella variabile il doppio del valore massimo (perché non c'è la "metà negativa dell'intervallo"). Si usano quando sei sicuro che il valore non può essere negativo.
Tipi interi signed
| Tipo | Dimensione | Intervallo valori | Esempio d'uso |
|---|---|---|---|
|
1 byte | -128 a 127 | -128, 0, 127 |
|
2 byte | -32 768 a 32 767 | -1000, 0, 32000 |
|
4 byte | -2 147 483 648 a 2 147 483 647 | -1000000, 0, 2000000 |
|
8 byte | -9 223 372 036 854 775 808 a 9 223 372 036 854 775 807 |
-10_000_000_000, 1 |
Tipi interi unsigned
| Tipo | Dimensione | Intervallo valori | Esempio d'uso |
|---|---|---|---|
|
1 byte | 0 a 255 | 0, 128, 255 |
|
2 byte | 0 a 65 535 | 1000, 65000 |
|
4 byte | 0 a 4 294 967 295 | 100, 4000000000 |
|
8 byte | 0 a 18 446 744 073 709 551 615 | 1, 18_000_000_000_000 |
Tipi decimali
| Tipo | Dimensione | Esempio di valori | Descrizione |
|---|---|---|---|
|
4 byte | 3.14f, -0.001f | precisione singola (7 cifre) |
|
8 byte | 3.1415, -1.7E+308 | precisione doppia (15-16 cifre) |
|
16 byte | 0.1m, 12345.6789m | alta precisione per finanza |
3. Suffissi per i numeri
In alcune situazioni devi specificare chiaramente che tipo vuoi usare per il numero. Si fa usando i suffissi:
- L o l — per il tipo long (esempio: 10000000000L)
- U o u — per il tipo uint (esempio: 123U)
- F o f — per il tipo float (esempio: 3.14f)
- D o d — per il tipo double (di solito non serve, perché i numeri decimali senza suffisso sono double)
- M o m — per il tipo decimal (esempio: 99.99m — super importante per i soldi!)
Se non metti il suffisso, di default un numero intero è int, e un decimale è double. Per esempio, 42 è int, e 3.14 è double.
Perché serve? Per esempio, per non avere errori quando assegni un numero grande a una variabile di tipo long:
long bigNumber = 9000000000L; // se togli L, errore di compilazione
E per i soldi è meglio usare sempre decimal con il suffisso m:
decimal price = 999.99m;
4. Separatore con underscore _
Quando i numeri sono lunghi, è facile confondersi con gli zeri. Per bellezza e comodità di lettura in C# puoi usare underscore dentro il numero.
int population = 146_700_000;
long stars = 100_000_000_000L;
È assolutamente legale: il compilatore ignora gli underscore, e tu puoi vedere subito le cifre "a colpo d'occhio". L'importante è non mettere l'underscore all'inizio, alla fine, dopo il punto o prima del suffisso.
5. Tipo carattere char
A volte nel programma devi lavorare non con i numeri, ma con singoli caratteri: una lettera, una cifra, un simbolo, anche uno spazio. Per questo c'è un tipo speciale — char.
Cos'è char?
È una variabile che memorizza un solo carattere:
- lettera latina o cirillica ('A', 'я')
- cifra ('5')
- simbolo speciale ('#', '%', '@')
- carattere di controllo ('\\n' — a capo)
Caratteristiche:
- Il valore di tipo char si scrive tra apici singoli: char letter = 'B';
- In realtà dentro char c'è il codice numerico del carattere (in Unicode), quindi char si può confrontare, convertire in int e persino fare semplici operazioni aritmetiche:
char a = 'A';
char b = (char)(a + 1); // 'B'
int code = a; // 65 — codice della lettera 'A'
Puoi usare caratteri speciali, tipo: char tab = '\\t'; // carattere di tabulazione
A cosa serve char?
Per lavorare con il testo carattere per carattere (tipo controllare la prima lettera di una stringa, cercare segni di punteggiatura, leggere una password carattere per carattere).
GO TO FULL VERSION