Articolo originale: Data Types in C - Integer, Floating Point, and Void Explained

Tipi di Dato in C

Ci sono parecchi modi per conservare dati in C, e sono tutti diversi l'uno dall'altro. I tipi di dato in cui le informazioni possono essere archiviate sono chiamati "data types". C perdona molto meno rispetto ad altri linguaggi per quanto riguarda i tipi di dato. Ne consegue che è importante comprendere i tipi di dato esistenti, le loro capacità e i loro limiti.

Una stranezza dei tipi di dato in C è che dipendono interamente dall'hardware sul quale stai eseguendo il codice. Un int nel tuo laptop sarà più piccolo rispetto a un int in un supercomputer, quindi conoscere i limiti dell'hardware sul quale stai lavorando è importante. Questa è anche la ragione per la quale i tipi di dato sono definiti con valori limite minimi e massimi - un valore int, come imparerai, potrà contenere valori da  -32767 a 32767; su certe macchine sarà però in grado di conservare valori anche eccedenti.

Ci sono due categorie in cui possiamo suddividere valori numerici: interi (integers) e in virgola mobile (floating points numbers). Gli interi sono numeri interi. Possono essere positivi, negativi oppure zero. Numeri come -321, 497, 19345, e -976812 sono tutti perfettamente validi, mentre 4.5 non lo è perché non è un numero intero.

I numeri in virgola mobile sono numeri con decimali. Comprendono anche i numeri interi, -321, 497, 19345, e -976812 che sono tutti validi, ma anche 4,5, 0,0004, -324,984, e altri numeri non interi sono validi.

C ci consente di scegliere tra parecchie opzioni per i nostri tipi di dato in quanto sono tutti conservati nel computer in modi diversi. Ne consegue che è importante conoscere limiti e capacità di ciascun tipo di dato per potere scegliere quello più appropriato.

Tipi di dato Interi

Caratteri: char

char contiene caratteri - cose come lettere, punteggiatura e spazi. In un computer i caratteri sono conservati come numeri, pertanto char contiene valori interi che rappresentano caratteri. L'effettiva transcodifica viene descritta dallo standard ASCII. Ecco una comoda tabella per cercare corrispondenze.

La dimensione reale, come tutti gli altri tipi di dato in C, dipende dall'hardware sul quale stai lavorando. Come minimo è di 8 bit, quindi contiene valori da 0 a 127. In alternativa si può usare un char con segno (signed char) che può contenere valori da  -128 a 127.

Interi Standard: int

La quantità di memoria che può utilizzare un singolo int dipende dall'hardware. Tuttavia puoi aspettarti che un int sia almeno di 16 bit. Il che vuol dire che può conservare valori da -32,768 a 32,767, o più a seconda dell'hardware.

Come per tutti gli altri tipi di dato c'è una variante senza segno (unsigned) che può essere usata. Il dato contenuto in un tipo unsigned int può essere positivo e zero ma non negativo, quindi può contenere valori da 0 a 65,535, o più a seconda dell'hardware.

Interi Corti: short

Questo tipo di dato non viene usato spesso, ma è meglio sapere che esiste. Come l'int può conservare valori da -32768 a 32767. Diversamente da int, tuttavia, queste sono tutte le sue capacità. Ogniqualvolta puoi usare short, puoi anche usare int.

Interi Lunghi: long

Il tipo di dato long conserva interi come il tipo int, ma offre una gamma di valori maggiore al costo di più memoria. long usa almeno 32 bit, e può quindi contenere valori da -2,147,483,648 a 2,147,483,647. In alternativa puoi usare unsigned long per una gamma di valori da 0 a 4,294,967,295.

Interi Ancora Più Lunghi: long long

Il tipo di dato long long è esagerato per quasi tutte le applicazioni, ma C ti consente comunque di usarlo. È in grado di conservare valori da  −9,223,372,036,854,775,807 a 9,223,372,036,854,775,807. In alternativa, esagerando ulteriormente, c'è il tipo senza segno unsigned long long, che conserva valori da 0 a 18,446,744,073,709,551,615.

Tipi di Dato in Virgola Mobile

Numeri in Virgola Mobile Base: float

float richiede almeno 32 bit per conservare il dato, ma offre fino a 6 cifre decimali da 1.2E-38 a 3.4E+38.

Doppi: double

double richiede il doppio di memoria rispetto a float (quindi almeno 64 bit). In cambio può offrire fino a 15 cifre decimali da 2.3E-308 a 1.7E+308.

Ottenere una gamma più ampia di double: long double

long double richiede almeno 80 bit. Pertanto può contenere fino a 19 cifre decimali da 3.4E-4932 a 1.1E+4932.

Scegliere il tipo di dato giusto

C ti fa scegliere il tipo di dato e ti fa essere molto specifico e intenzionale sul modo in cui lo fai. Questo ti dà molto potere sul tuo codice, ma è importante scegliere quello giusto.

In generale, dovresti scegliere il tipo minimo per il tuo scopo. Se sai che conterai interi da 1 a 10, non ti serve un long e neppure un double. Se sai che non avrai mai valori negativi, appoggiati alle varianti unsigned dei rispettivi tipi di dato. Fornendo questa funzionalità invece che facendolo automaticamente, C è in grado di produrre codice molto leggero ed efficiente. Tuttavia dipende da te, come programmatore, capire capacità e limiti e scegliere in modo appropriato.

Possiamo usare la funzione sizeof() per verificare la dimensione di una variabile. Dai un'occhiata al seguente programma in  C che mostra l'utilizzo dei diversi tipi:

#include <stdio.h>

int main()
{
    int a = 1;
    
    char b ='G';
    
    double c = 3.14;
    
    printf("Hello World!\n");
 
    //stampa le variabili definite qui sopra assieme alle loro dimensioni
    printf("Ciao! Sono un carattere. Il mio valore è %c e "
           "la mia dimensione è %lu byte.\n", b,sizeof(char));
    //puoi anche usare sizeof(b) qui sopra
 
    printf("Ciao! Sono un intero. Il mio valore è %d e "
           "la mia dimensione è %lu  byte.\n", a,sizeof(int));
    //puoi anche usare sizeof(a) qui sopra
 
    printf("Ciao! Sono una variabile in virgola mobile."
           " Il mio valore è %lf e la mia dimensione è %lu byte.\n",c,sizeof(double));
    //puoi anche usare sizeof(c) qui sopra
 
    printf("Ciao! A presto. :)\n");
    return 0;
}

Risultato:

Hello World!
Ciao! Sono un carattere. Il mio valore è G e la mia dimensione è 1 byte.
Ciao! Sono un intero. Il mio valore è 1 e la mia dimensione è 4  byte.
Ciao! Sono una variabile in virgola mobile. Il mio valore è 3.140000 e la mia dimensione è 8 byte.
Ciao! A presto. :)

Il Tipo Void

void specifica che non c'è un valore disponibile. Viene usato in tre tipi di situazione:

1. Funzione che ritorna void

Ci sono varie funzioni in C che non restituiscono alcun valore oppure puoi dire che restituiscono void. Una funzione senza valore di ritorno ha il tipo di valore ritornato void. Per esempio, void exit (int status);

2. Argomenti di funzione come void

Diverse funzioni in C non accettano parametri. Una funzione senza parametri può accettare un void. Per esempio, int rand(void);

3. Puntatori a void

Un puntatore di tipo void * rappresenta l'indirizzo di un oggetto, ma non il suo tipo. Per esempio una funzione di allocazione di memoria void *malloc( size_t size); ritorna un puntatore a void, che può essere convertito in qualsiasi altro tipo di dato.