Tipi di dati
Perché esistono i tipi di dati?
Sezione intitolata “Perché esistono i tipi di dati?”Pensa ai tipi come a scomparti destinati a valori diversi: uno può contenere interi, un altro caratteri o numeri decimali.
In C++ funziona allo stesso modo: ogni variabile ha un tipo che stabilisce che genere di valore può contenere. A differenza di Python, non puoi mettere qualsiasi cosa in qualsiasi variabile: devi dichiarare il tipo in anticipo.
Il compilatore può controllare meglio i valori e le operazioni compatibili con ogni variabile.
Numeri interi: int
Sezione intitolata “Numeri interi: int”int (abbreviazione di integer, intero) contiene numeri senza virgola, sia positivi che negativi:
int eta = 16;int temperatura = -5;int anno = 2024;int zero = 0;Su molti sistemi un int occupa 4 byte e contiene valori da circa -2 miliardi a +2 miliardi. Lo standard C++ non impone però una dimensione identica su ogni piattaforma. Per i primi programmi puoi usare int per i normali numeri interi.
Se hai bisogno di numeri molto grandi o molto piccoli, esistono varianti:
short int piccolo = 32000;long long enorme = 9000000000000LL;Numeri decimali: float e double
Sezione intitolata “Numeri decimali: float e double”Per numeri con la virgola (come 3.14 o 1.75) hai due opzioni.
Su molti sistemi occupa 4 byte e conserva circa 6-7 cifre significative. Metti la f alla fine del numero per indicare che il valore è un float:
float temperatura = 36.6f;float pi = 3.14159f;Su molti sistemi occupa 8 byte e conserva circa 15-16 cifre significative. È la scelta più comune per i calcoli decimali generici:
double altezza = 1.75;double pi = 3.14159265358979;Quale usare?
Sezione intitolata “Quale usare?”Per iniziare, preferisci double a meno che un progetto richieda espressamente float. Offre più precisione, ma i numeri decimali binari restano approssimazioni:
// Possibile problema con floatfloat a = 0.1f + 0.2f;cout << a; // potrebbe stampare 0.3000001 invece di 0.3
// Anche double può mostrare un'approssimazione, ma conserva più cifredouble b = 0.1 + 0.2;cout << b;Singolo carattere: char
Sezione intitolata “Singolo carattere: char”char (abbreviazione di character, carattere) contiene un singolo carattere. I caratteri si scrivono tra apici singoli '...':
char lettera = 'A';char cifra = '7';char spazio = ' ';Internamente, un char contiene un piccolo valore numerico. Per i caratteri di base, come 'A', quel valore segue normalmente la codifica ASCII. Un singolo char non basta invece a rappresentare in modo generale tutti i caratteri Unicode.
char c = 'A';cout << c; // stampa: Acout << (int)c; // stampa: 65 (il codice numerico di 'A')Vero o falso: bool
Sezione intitolata “Vero o falso: bool”bool (abbreviazione di boolean, booleano) può contenere solo due valori: true (vero) o false (falso):
bool maggiorenne = true;bool haPatente = false;bool risultato = (5 > 3); // true, perché 5 è maggiore di 3Quando stampi un bool, di default viene mostrato come 1 (true) o 0 (false). Per stampare le parole true e false:
bool x = true;cout << x; // stampa: 1cout << boolalpha << x; // stampa: trueQuanto spazio occupano?
Sezione intitolata “Quanto spazio occupano?”Puoi controllare quanti byte occupa un tipo con sizeof:
cout << sizeof(int) << endl; // 4cout << sizeof(double) << endl; // 8cout << sizeof(char) << endl; // 1cout << sizeof(bool) << endl; // 1Riepilogo
Sezione intitolata “Riepilogo”| Tipo | Spazio | Valori |
|---|---|---|
int |
4 byte | numeri interi, da -2 miliardi a +2 miliardi |
float |
4 byte | decimali, ~7 cifre significative |
double |
8 byte | decimali, ~15 cifre significative |
char |
1 byte | un singolo carattere |
bool |
1 byte | solo true oppure false |
Convertire tra tipi
Sezione intitolata “Convertire tra tipi”A volte hai bisogno di convertire un valore da un tipo all’altro.
La conversione implicita avviene automaticamente quando è sicura:
int x = 5;double y = x; // int viene convertito in double automaticamentecout << y; // 5.0La conversione esplicita (chiamata casting) si usa quando vuoi forzare una conversione:
double pi = 3.14159;int parteIntera = (int)pi; // la parte decimale viene scartatacout << parteIntera; // 3 (non arrotondato, solo troncato)Attenzione alla divisione tra interi: quando dividi due int, il risultato è sempre un intero (la parte decimale viene persa):
int x = 5, y = 2;int risultato = x / y; // risultato = 2, non 2.5!double risultato2 = (double)x / y; // risultato2 = 2.5 (corretto)Esempio pratico
Sezione intitolata “Esempio pratico”#include <iostream>using namespace std;
int main() { // Una variabile per ogni tipo principale int eta = 16; double altezza = 1.75; char iniziale = 'A'; bool maggiorenne = false;
cout << "Età (int): " << eta << endl; cout << "Altezza (double): " << altezza << endl; cout << "Iniziale (char): " << iniziale << endl; cout << "Maggiorenne (bool): " << boolalpha << maggiorenne << endl;
return 0;}Output:
Età (int): 16Altezza (double): 1.75Iniziale (char): AMaggiorenne (bool): false