I tipi di dato rappresentano le fondamenta della
programmazione in C. Comprendere le differenze tra
char,
int,
float,
double
e le loro varianti signed,
unsigned,
short
e long permette di sviluppare
programmi più efficienti, affidabili e portabili.
I tipi
di dato nel linguaggio C: guida completa.
Pubblicato il: 14-7-2026
Ultima Modifica: 14-7-2026
Il linguaggio C è uno dei linguaggi di
programmazione più potenti e longevi mai realizzati. Una
delle prime cose che un programmatore deve imparare è
l'utilizzo dei tipi di dato, ovvero le
strutture che permettono di memorizzare numeri, caratteri,
valori logici e molto altro.
Scegliere il tipo di dato corretto è fondamentale per
scrivere programmi efficienti, veloci e che occupino la
giusta quantità di memoria.
In questa guida vedremo nel dettaglio tutti i principali
tipi di dato del linguaggio C, con numerosi esempi pratici e
consigli utili.
📖 Cosa sono i tipi di dato?
Ogni variabile deve essere dichiarata indicando il tipo
di informazione che conterrà.
Ad esempio:
int eta = 25;
In questo caso:
int indica che la variabile
conterrà un numero intero.
eta è il nome della variabile.
25 è il valore assegnato.
Il compilatore utilizza il tipo di dato per sapere:
quanta memoria riservare;
quali operazioni sono consentite;
quale intervallo di valori può essere memorizzato.
💾 Perché esistono più tipi di dato?
Non tutti i dati hanno le stesse caratteristiche.
Ad esempio:
l'età di una persona è un numero intero;
la temperatura può avere i decimali;
una lettera occupa molto meno spazio di un numero;
un valore vero/falso richiede pochissima memoria.
Per questo motivo il linguaggio C mette a disposizione
numerosi tipi differenti.
🏗 Classificazione dei tipi di dato
I tipi di dato del C possono essere suddivisi in quattro
grandi categorie.
📌 Tipi fondamentali
char
int
float
double
void
📌 Tipi modificati
short
long
signed
unsigned
📌 Tipi derivati
array
puntatori
strutture
unioni
enumerazioni
📌 Tipi definiti dal programmatore
Attraverso:
typedef
🔤 Il tipo char
Il tipo char serve per memorizzare un
singolo carattere.
Occupa generalmente 1 byte.
Esempio:
char iniziale = 'P';
Stampa:
printf("%c", iniziale);
Output
P
💡 Codice ASCII
In realtà un carattere è memorizzato come numero.
Ad esempio:
char lettera = 'A';
Il compilatore salva il valore:
65
che corrisponde al codice ASCII della lettera A.
Possiamo verificarlo:
#include <stdio.h>
int main()
{
char c = 'A';
printf("%d", c);
return 0;
}
Output
65
🔢 Il tipo int
Il tipo più utilizzato.
Serve per memorizzare numeri interi.
int numero = 150;
Esempio:
#include <stdio.h>
int main()
{
int a = 20;
int b = 15;
printf("%d", a + b);
return 0;
}
Output
35
📏 Dimensione di int
La dimensione dipende dal compilatore e
dall'architettura.
Sui sistemi moderni è quasi sempre:
4 byte
cioè
32 bit
Intervallo tipico:
-2.147.483.648
fino a
2.147.483.647
🌊 Il tipo float
Serve per memorizzare numeri con la virgola.
Esempio:
float temperatura = 23.5;
Stampa:
printf("%.2f", temperatura);
Output
23.50
🎯 Precisione del float
Il tipo float offre circa:
6-7 cifre significative
Per molti programmi è più che sufficiente.
🚀 Il tipo double
Quando serve una maggiore precisione si utilizza
double.
double pi = 3.141592653589793;
Output
3.141592653589793
Il tipo double utilizza generalmente:
8 byte
ed offre circa:
15-16 cifre significative
⚡ long double
Per calcoli scientifici esiste:
long double
che offre una precisione ancora maggiore (dipendente dal
compilatore e dalla piattaforma).
🚫 Il tipo void
Il tipo void significa:
"nessun valore".
Viene utilizzato soprattutto nelle funzioni.
Esempio:
void saluta()
{
printf("Ciao!");
}
La funzione non restituisce alcun valore.
🔄 signed e unsigned
Per impostazione predefinita i numeri interi sono
signed, cioè possono essere positivi o negativi.
signed int saldo;
Intervallo:
-100
0
100
Con unsigned si eliminano i numeri
negativi.
unsigned int popolazione;
In questo modo tutto l'intervallo disponibile viene
utilizzato per numeri positivi.
📦 short
Quando servono numeri piccoli è possibile utilizzare:
short
oppure
short int
Generalmente occupa:
2 byte
📚 long
Per numeri più grandi esiste:
long
oppure
long int
Su molti sistemi occupa:
8 byte
ma può variare in base al compilatore e al sistema
operativo.
🔢 unsigned char
Anche il tipo char può essere unsigned.
unsigned char valore = 255;
Intervallo:
0 - 255
🧮 La funzione sizeof()
Per conoscere la dimensione di un tipo di dato si
utilizza l'operatore:
La dimensione dei tipi di dato non è fissata
dallo standard C (tranne alcune relazioni minime
tra essi), ma dipende dalla piattaforma e dal compilatore
utilizzato. Per questo motivo è sempre consigliabile usare
sizeof() quando si desidera conoscere
la dimensione effettiva.
📊 Tabella riassuntiva
Tipo
Dimensione tipica*
Contiene
char
1 byte
caratteri
short
2 byte
interi piccoli
int
4 byte
interi
long
4 o 8 byte
interi grandi
long long
8 byte
interi molto grandi
float
4 byte
numeri decimali
double
8 byte
numeri decimali ad alta precisione
long double
8, 12 o 16
byte
precisione elevata
void
nessuna
nessun valore
*Le dimensioni riportate sono quelle più comuni sulle
piattaforme moderne.
🔍 I tipi interi
Il C mette a disposizione numerose combinazioni.
char
signed char
unsigned char
short
unsigned short
int
unsigned int
long
unsigned long
long long
unsigned long long
🧠 Conversione automatica
Il compilatore effettua spesso conversioni automatiche.
int a = 10;
float b = 2.5;
float risultato = a + b;
L'intero viene convertito automaticamente in float.
🎯 Conversione esplicita (Casting)
Possiamo convertire manualmente un tipo.
float media = (float)totale / numero;
Il cast evita che la divisione venga eseguita come
divisione tra interi.
❌ Overflow
Ogni tipo possiede un limite.
Esempio:
unsigned char numero = 255;
numero++;
printf("%u", numero);
Possibile output
0
Il valore supera il limite massimo e ricomincia da zero
(comportamento tipico dei tipi senza segno).
💡 Suggerimento
Scegli sempre il tipo di dato più adatto alle tue
esigenze. Usare un tipo troppo grande comporta uno spreco di
memoria, mentre un tipo troppo piccolo può causare errori di
overflow o perdita di precisione.
📌 Utilizzare <stdbool.h>
A partire dallo standard C99 è disponibile il tipo logico
_Bool tramite l'header
<stdbool.h>, che definisce anche gli
alias bool, true
e false.
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool acceso = true;
if (acceso)
printf("Sistema acceso\n");
return 0;
}
🛠 Tipi a dimensione fissa
Quando è necessario sapere con certezza la dimensione di
un tipo (ad esempio nei protocolli di rete o nella lettura
di file binari), è consigliabile utilizzare i tipi definiti
nell'header <stdint.h>.
if (maggiorenne)
printf("L'utente e' maggiorenne.\n");
return 0;
}
Output:
Iniziale: P
Eta': 30
Altezza: 1.78
Peso: 74.5
L'utente e' maggiorenne.
🎯 Conclusioni
I tipi di dato rappresentano le fondamenta della
programmazione in C. Comprendere le differenze tra
char, int,
float, double
e le loro varianti signed,
unsigned, short
e long permette di sviluppare
programmi più efficienti, affidabili e portabili.
Con l'esperienza imparerai a scegliere il tipo più adatto
in ogni situazione, evitando sprechi di memoria, errori di
precisione e problemi di compatibilità. Padroneggiare questi
concetti è un passo fondamentale per affrontare argomenti
più avanzati come puntatori, strutture dati, gestione della
memoria e programmazione di sistema.