1. Quali tipi di numeri esistono?
In programmazione lavoriamo continuamente con i numeri — dall’età dell’utente al numero di stelle in una galassia o ai centesimi su un conto bancario. Ma compiti diversi richiedono tipi di numeri diversi: a volte è importante conservare solo numeri interi, a volte frazioni molto precise e talvolta servono numeri “senza meno”.
Numeri interi (int e altri)
Un numero intero è un numero senza parte frazionaria.
In Java si usa più spesso il tipo int, ma oltre a questo ce ne sono altri che differiscono per dimensione e intervallo.
- int — il tipo principale per i numeri interi. Può contenere valori molto grandi (e piccoli) e non occupa molta memoria. Ad esempio, per contare i like, l’età, il numero di giorni in un anno quasi sempre si userà int.
- long — si usa quando i valori possono essere molto grandi (per esempio miliardi o trilioni). Esempio: memorizzare il numero totale di visualizzazioni di YouTube nella sua storia.
- short — un tipo parco di memoria ma poco usato. Utile dove ci sono molti piccoli valori simili (per esempio, dati audio, componenti di colore).
- byte — per valori ancora più piccoli, soprattutto in grafica e nella gestione di file, dove è importante risparmiare memoria.
Numeri in virgola mobile (double, float)
Talvolta serve lavorare con numeri che hanno una parte frazionaria. Per esempio, la temperatura dell’aria, la media di uno studente, il prezzo di un prodotto con i centesimi.
- double — è il tipo “predefinito” per memorizzare numeri in virgola mobile. Abbastanza preciso per la maggior parte dei calcoli (es.: 3.1415926535…).
- float — più leggero e meno preciso, si incontra spesso nella grafica computazionale o nell’elaborazione di grandi insiemi di dati, dove è importante risparmiare memoria.
Tipi numerici speciali
- BigInteger — quando serve lavorare con numeri enormi, oltre gli intervalli standard, ad esempio in crittografia o in calcoli astronomici.
- BigDecimal — classe per calcoli precisi con numeri decimali (finanza, calcolo di percentuali), aiuta a evitare le imprecisioni tipiche di double e float.
2. Intervalli di valori
I tipi interi possono memorizzare sia numeri positivi sia negativi. È comodo quando i valori possono essere “sopra o sotto lo zero”: ad esempio temperatura, saldo del conto, altitudine rispetto al livello del mare.
Esempio:
- int : -10, 0, 50
- long : 0, 10, -1000_000_000_000_000_000L
Tipi interi
| Tipo | Dimensione | Intervallo di valori | Esempio d'uso |
|---|---|---|---|
|
1 byte | da -128 a 127 | -128, 0, 127 |
|
2 byte | da -32 768 a 32 767 | -1000, 0, 32000 |
|
4 byte | da -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 a virgola mobile
| Tipo | Dimensione | Esempi di valori | Descrizione |
|---|---|---|---|
|
4 byte | 3.14f, -0.001f | precisione singola (7 cifre) |
|
8 byte | 3.1415, -1.7E+308 | doppia precisione (15-16 cifre) |
3. Suffissi per i numeri
In alcune situazioni è necessario indicare esplicitamente quale tipo vuoi usare per un numero. Questo si fa mediante i suffissi:
- L o l — per il tipo long (per esempio, 10000000000L)
- F o f — per il tipo float (per esempio, 3.14f)
- D o d — per il tipo double (di solito non serve, perché i numeri con la virgola senza suffisso sono double)
Se non specifichi un suffisso, per impostazione predefinita un numero intero è int, mentre un numero con la virgola è double. Ad esempio, 42 è int, e 3.14 è double.
A cosa serve? Ad esempio, per evitare un errore quando si assegna un numero grande a una variabile di tipo long:
long bigNumber = 9000000000L; // se si rimuove la L, ci sarà un errore di compilazione
Separatore con il trattino basso _
Quando i numeri sono lunghi, è facile confondersi con gli zeri. Per bellezza e leggibilità, in Java si possono usare trattini bassi (underscore) all'interno del numero.
int population = 146_700_000;
long stars = 100_000_000_000L;
È perfettamente legale: il compilatore ignora gli underscore e a colpo d’occhio vedi subito gli ordini di grandezza. L’importante è non metterli all’inizio o alla fine, dopo il punto o prima del suffisso.
4. Tipo di carattere char: che cos’è e a cosa serve?
Il tipo char si usa per memorizzare un solo carattere: lettera, cifra, segno di punteggiatura, spazio, carattere speciale e perfino una faccina.
Esempi:
char letter = 'A';
char digit = '7';
char symbol = '?';
char cyrillic = '\u0416';
char euro = '€';
char smile = '☺'; // Sì, si può anche questo!
Regole importanti:
- Un valore di tipo char si scrive tra apici singoli: 'A', '7', '#'.
- È proprio un solo carattere! Se scrivi 'AB', il compilatore genererà un errore.
- Ogni carattere ha un proprio codice numerico (Unicode).
Unicode: caratteri da tutto il mondo
Java usa lo standard Unicode, che permette di memorizzare non solo le lettere latine, ma anche il cirillico, gli ideogrammi, le emoji e perfino i geroglifici egizi (se mai servissero).
Curiosità:
Il tipo char è, in sostanza, un numero a 16 bit (da 0 a 65535), a ciascun valore corrisponde un carattere.
5. Caratteri e numeri: il legame tramite Unicode
Poiché internamente ogni carattere è un numero, possiamo convertire senza problemi char in int e viceversa.
Esempio: ottenere il codice Unicode di un carattere
public class CharToInt {
public static void main(String[] args) {
char ch = 'A';
int code = ch; // conversione implicita char → int
System.out.println("Codice del carattere '" + ch + "': " + code);
}
}
Risultato:
Codice del carattere 'A': 65
E ora il contrario — ottenere il carattere a partire dal codice:
public class IntToChar {
public static void main(String[] args) {
int code = 1040; // Codice della lettera '\u0410' in Unicode (cirillico)
char ch = (char) code; // Conversione esplicita int → char
System.out.println("Carattere con codice " + code + ": " + ch);
}
}
Risultato:
Carattere con codice 1040: \u0410
6. Tipi primitivi fondamentali di Java
| Tipo | Dimensione (bit) | Intervallo di valori | Esempio di valore | Nota |
|---|---|---|---|---|
|
8 | -128 ... 127 | 42 | Molto raramente usato |
|
16 | -32,768 ... 32,767 | 12345 | Per risparmiare memoria |
|
32 | -2,147,483,648 ... 2,147,483,647 | 1000000 | Principale per i numeri interi |
|
64 | ≈ −9.22 × 1018 ... ≈ 9.22 × 1018 | 5000000000L | Per interi molto grandi |
|
32 | ~±3.4 × 10-38 ... ±3.4 × 1038 | 3.14f | Numeri in virgola mobile, bassa precisione |
|
64 | ~±1.7 × 10-308 ... ±1.7 × 10308 | 2.718 | Numeri in virgola mobile, alta precisione |
|
16 | 0 ... 65 535 (Unicode) | '\u0416', 'A', '?' | Un solo carattere |
|
1 | true, false | true | Valore booleano |
GO TO FULL VERSION