C - Tipi di dati

I tipi di dati in c si riferiscono a un sistema esteso utilizzato per dichiarare variabili o funzioni di diversi tipi. Il tipo di variabile determina quanto spazio occupa nella memoria e come viene interpretata la sequenza di bit memorizzata.

I tipi in C possono essere classificati come segue:

Sr.No. Tipi e descrizione
1

Basic Types

Sono tipi aritmetici e sono ulteriormente classificati in: (a) tipi interi e (b) tipi a virgola mobile.

2

Enumerated types

Sono di nuovo tipi aritmetici e vengono utilizzati per definire variabili che possono assegnare solo determinati valori interi discreti in tutto il programma.

3

The type void

L'identificatore di tipo void indica che non è disponibile alcun valore.

4

Derived types

Includono (a) tipi di puntatore, (b) tipi di array, (c) tipi di struttura, (d) tipi di unione e (e) tipi di funzione.

I tipi di matrice e i tipi di struttura vengono indicati collettivamente come i tipi di aggregazione. Il tipo di una funzione specifica il tipo di valore restituito dalla funzione. Vedremo i tipi di base nella sezione seguente, dove altri tipi verranno trattati nei prossimi capitoli.

Tipi interi

La tabella seguente fornisce i dettagli dei tipi interi standard con le dimensioni di archiviazione e gli intervalli di valori:

genere Dimensioni di archiviazione Intervallo di valori
char 1 byte Da -128 a 127 o da 0 a 255
carattere non firmato 1 byte Da 0 a 255
firmato char 1 byte Da -128 a 127
int 2 o 4 byte Da -32.768 a 32.767 o da -2.147.483.648 a 2.147.483.647
unsigned int 2 o 4 byte Da 0 a 65.535 o da 0 a 4.294.967.295
corto 2 byte Da -32.768 a 32.767
corto non firmato 2 byte Da 0 a 65.535
lungo 8 byte o (4 byte per OS a 32 bit) -9223372036854775808 a 9223372036854775807
non firmato a lungo 8 byte 0 a 18446744073709551615

Per ottenere la dimensione esatta di un tipo o di una variabile su una particolare piattaforma, puoi utilizzare il sizeofoperatore. Le espressioni sizeof (tipo) restituiscono le dimensioni di archiviazione dell'oggetto o del tipo in byte. Di seguito è riportato un esempio per ottenere le dimensioni di vari tipi su una macchina utilizzando una costante diversa definita nel file di intestazione limits.h -

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

    printf("CHAR_BIT    :   %d\n", CHAR_BIT);
    printf("CHAR_MAX    :   %d\n", CHAR_MAX);
    printf("CHAR_MIN    :   %d\n", CHAR_MIN);
    printf("INT_MAX     :   %d\n", INT_MAX);
    printf("INT_MIN     :   %d\n", INT_MIN);
    printf("LONG_MAX    :   %ld\n", (long) LONG_MAX);
    printf("LONG_MIN    :   %ld\n", (long) LONG_MIN);
    printf("SCHAR_MAX   :   %d\n", SCHAR_MAX);
    printf("SCHAR_MIN   :   %d\n", SCHAR_MIN);
    printf("SHRT_MAX    :   %d\n", SHRT_MAX);
    printf("SHRT_MIN    :   %d\n", SHRT_MIN);
    printf("UCHAR_MAX   :   %d\n", UCHAR_MAX);
    printf("UINT_MAX    :   %u\n", (unsigned int) UINT_MAX);
    printf("ULONG_MAX   :   %lu\n", (unsigned long) ULONG_MAX);
    printf("USHRT_MAX   :   %d\n", (unsigned short) USHRT_MAX);

    return 0;
}

Quando compili ed esegui il programma sopra, produce il seguente risultato su Linux:

CHAR_BIT    :   8
CHAR_MAX    :   127
CHAR_MIN    :   -128
INT_MAX     :   2147483647
INT_MIN     :   -2147483648
LONG_MAX    :   9223372036854775807
LONG_MIN    :   -9223372036854775808
SCHAR_MAX   :   127
SCHAR_MIN   :   -128
SHRT_MAX    :   32767
SHRT_MIN    :   -32768
UCHAR_MAX   :   255
UINT_MAX    :   4294967295
ULONG_MAX   :   18446744073709551615
USHRT_MAX   :   65535

Tipi in virgola mobile

La tabella seguente fornisce i dettagli dei tipi a virgola mobile standard con dimensioni di archiviazione e intervalli di valori e la loro precisione -

genere Dimensioni di archiviazione Intervallo di valori Precisione
galleggiante 4 byte Da 1.2E-38 a 3.4E + 38 6 cifre decimali
Doppio 8 byte Da 2.3E-308 a 1.7E + 308 15 cifre decimali
doppio lungo 10 byte Da 3.4E-4932 a 1.1E + 4932 19 cifre decimali

Il file di intestazione float.h definisce le macro che consentono di utilizzare questi valori e altri dettagli sulla rappresentazione binaria dei numeri reali nei programmi. L'esempio seguente stampa lo spazio di archiviazione occupato da un tipo float e i suoi valori di intervallo:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

    printf("Storage size for float : %d \n", sizeof(float));
    printf("FLT_MAX     :   %g\n", (float) FLT_MAX);
    printf("FLT_MIN     :   %g\n", (float) FLT_MIN);
    printf("-FLT_MAX    :   %g\n", (float) -FLT_MAX);
    printf("-FLT_MIN    :   %g\n", (float) -FLT_MIN);
    printf("DBL_MAX     :   %g\n", (double) DBL_MAX);
    printf("DBL_MIN     :   %g\n", (double) DBL_MIN);
    printf("-DBL_MAX     :  %g\n", (double) -DBL_MAX);
    printf("Precision value: %d\n", FLT_DIG );

    return 0;
}

Quando compili ed esegui il programma sopra, produce il seguente risultato su Linux:

Storage size for float : 4 
FLT_MAX      :   3.40282e+38
FLT_MIN      :   1.17549e-38
-FLT_MAX     :   -3.40282e+38
-FLT_MIN     :   -1.17549e-38
DBL_MAX      :   1.79769e+308
DBL_MIN      :   2.22507e-308
-DBL_MAX     :  -1.79769e+308
Precision value: 6

Il tipo vuoto

Il tipo void specifica che non è disponibile alcun valore. Viene utilizzato in tre tipi di situazioni:

Sr.No. Tipi e descrizione
1

Function returns as void

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

2

Function arguments as void

Ci sono varie funzioni in C che non accettano alcun parametro. Una funzione senza parametro può accettare un vuoto. Per esempio,int rand(void);

3

Pointers to void

Un puntatore di tipo void * rappresenta l'indirizzo di un oggetto, ma non il suo tipo. Ad esempio, una funzione di allocazione della memoriavoid *malloc( size_t size ); restituisce un puntatore a void che può essere convertito in qualsiasi tipo di dati.