Differenza tra int32, int, int32_t, int8 e int8_t


104

Di int32_trecente mi sono imbattuto nel tipo di dati in un programma C. So che memorizza 32 bit, ma non lo fai inte int32fai lo stesso?

Inoltre, voglio utilizzare charin un programma. Posso usare int8_tinvece? Qual è la differenza?

Riassumendo: qual è la differenza tra int32, int, int32_t, int8 e int8_t in C?

Risposte:


122

Tra int32e int32_t, (e allo stesso modo tra int8e int8_t) la differenza è piuttosto semplice: lo standard C definisce int8_te int32_t, ma non definisce nulla con nome int8o int32- quest'ultimo (se esistono) proviene probabilmente da qualche altra intestazione o libreria (molto probabilmente precede l'aggiunta di int8_te int32_tin C99).

Plain intè un po 'diverso dagli altri. Dove int8_te int32_tciascuno hanno una dimensione specificata, intpuò essere qualsiasi dimensione> = 16 bit. In momenti diversi, sia 16 bit che 32 bit sono stati ragionevolmente comuni (e per un'implementazione a 64 bit, dovrebbe probabilmente essere 64 bit).

D'altra parte, intè garantita la presenza in ogni implementazione di C, dove int8_teint32_t non lo sono. Probabilmente è aperto a chiedersi se questo sia importante per te. Se usi C su piccoli sistemi embedded e / o vecchi compilatori, potrebbe essere un problema. Se lo usi principalmente con un compilatore moderno su macchine desktop / server, probabilmente non lo sarà.

Oops - perso la parte su char. Dovresti usare al int8_tposto di char se (e solo se) vuoi che un tipo intero abbia una dimensione esattamente di 8 bit. Se vuoi memorizzare i caratteri, probabilmente vorrai usarli char. La sua dimensione può variare (in termini di numero di bit) ma è garantito che sia esattamente un byte. Una piccola stranezza però: non c'è alcuna garanzia che un semplice charsia firmato o non firmato (e molti compilatori possono renderlo uno qualsiasi, a seconda di un flag in fase di compilazione). Se è necessario assicurarsi che sia firmato o non firmato, è necessario specificarlo esplicitamente.


1
@linuxfreak: Non ne sono sicuro, non ne ho bool_tmai sentito parlare prima. Lo standard C definisce _Boolcome un tipo incorporato. boolè definito solo se tu #include <stdbool.h>(come macro che si espande a _Bool).
Jerry Coffin

5
Hai detto "per un'implementazione a 64 bit, (int) dovrebbe probabilmente essere a 64 bit". In pratica, int è a 32 bit su tutte le comuni piattaforme a 64 bit, inclusi Windows, Mac OS X, Linux e varie versioni di UNIX. Un'eccezione è Cray / UNICOS, ma oggigiorno sono fuori moda.
Sam Watkins

6
@SamWatkins: Sì, è per questo che ho detto con attenzione "dovrebbe essere", non "è". Lo standard dice che è "la dimensione naturale suggerita dall'architettura", che (IMO) significa che su un processore a 64 bit, dovrebbe essere davvero a 64 bit (anche se, nel bene e nel male, hai ragione che di solito non lo è " t). Da un punto di vista più pratico, è terribilmente utile avere un tipo a 32 bit tra i tipi in C89, e se int è 64 bit, anche long deve essere almeno 64 bit, quindi spesso non ci sarebbe 32 bit genere.
Jerry Coffin

2
@barlop: Sì. (Sia C che C ++ richiedono un intervallo minimo di 255 valori per char, quindi richiede almeno 8 bit, ma può essere di più).
Jerry Coffin

2
Ho sempre avuto l'impressione che un byte fosse esattamente 8 bit, non da 8 bit in su
ErlVolton

18

I tipi di dati _t sono tipi typedef nell'intestazione stdint.h, mentre int è un tipo di dati fondamentale integrato. Ciò rende _t disponibile solo se esiste stdint.h. int d'altra parte è garantita l'esistenza.


1
Perché si dovrebbero usare quelli _t?
Deven

@ Deven Per evitare il caso in cui il tuo codice funziona da qualche parte ma non da qualche altra parte.
Franklin Yu

2

Tieni sempre presente che 'size' è variabile se non esplicitamente specificato, quindi se dichiari

 int i = 10;

Su alcuni sistemi può risultare in un numero intero a 16 bit dal compilatore e su altri può risultare in un intero a 32 bit (o intero a 64 bit nei sistemi più recenti).

Negli ambienti embedded questo può portare a risultati strani (specialmente durante la gestione dell'I / O mappato in memoria o può essere considerato una semplice situazione di array), quindi si consiglia vivamente di specificare variabili di dimensioni fisse. Nei sistemi legacy potresti imbatterti

 typedef short INT16;
 typedef int INT32;
 typedef long INT64; 

A partire da C99, i progettisti hanno aggiunto il file di intestazione stdint.h che essenzialmente sfrutta typedef simili.

Su un sistema basato su Windows, potresti vedere le voci nel file di intestazione stdin.h come

 typedef signed char       int8_t;
 typedef signed short      int16_t;
 typedef signed int        int32_t;
 typedef unsigned char     uint8_t;

C'è molto di più in questo come i tipi interi a larghezza minima o interi a larghezza esatta, penso che non sia una brutta cosa esplorare stdint.h per una migliore comprensione.


1
Il tuo codice ha un errore di battitura:, typedef short INT16;non typedefs short INT16.
Galaxy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.