TextFile
tipi di dati C 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.
home page
 

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:

sizeof()

Esempio:

 
#include <stdio.h>

int main()
{
    printf("%zu\n", sizeof(char));
    printf("%zu\n", sizeof(int));
    printf("%zu\n", sizeof(float));
    printf("%zu\n", sizeof(double));

    return 0;
}

Possibile output:

1
4
4
8

⚠ Attenzione

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>.

Esempio:

 
#include <stdint.h>

int8_t   piccolo;
uint16_t codice;
int32_t  valore;
uint64_t grandeNumero;

Questi tipi garantiscono una dimensione precisa indipendentemente dal compilatore.


🎓 Esempio completo

 
#include <stdio.h>
#include <stdbool.h>

int main()
{
    char iniziale = 'P';
    int eta = 30;
    float altezza = 1.78f;
    double peso = 74.5;
    bool maggiorenne = true;

    printf("Iniziale: %c\n", iniziale);
    printf("Eta': %d\n", eta);
    printf("Altezza: %.2f\n", altezza);
    printf("Peso: %.1f\n", peso);

    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.