Come dichiarare un numero intero a 32 bit in C
-
22-07-2019 - |
Domanda
Qual è il modo migliore per dichiarare un tipo intero che è sempre 4 byte su qualsiasi piattaforma? Non mi preoccupo per alcuni dispositivi o macchine vecchie che hanno 16 bit int
.
Soluzione
#include <stdint.h>
int32_t my_32bit_int;
Altri suggerimenti
C non si preoccupa molto delle dimensioni esatte dei tipi interi, C99 introduce l'intestazione stdint.h , che è probabilmente la tua scommessa migliore. Includilo e puoi usare ad es. int32_t
. Naturalmente non tutte le piattaforme potrebbero supportarlo.
La risposta di Corey è corretta per " migliore " ;, secondo me, ma una semplice " int " funzionerà anche in pratica (dato che stai ignorando i sistemi con int a 16 bit). A questo punto, così tanto codice dipende dall'int 32-bit che i fornitori di sistema non lo cambieranno.
(Vedi anche perché long è 32 bit su molti sistemi a 64 bit e perché abbiamo " long long " ;.)
Uno dei vantaggi dell'utilizzo di int32_t, tuttavia, è che non stai perpetuando questo problema!
Potresti dare la caccia a una copia di brg_types.h
di Brian Gladman se non hai stdint.h
.
<=> scoprirà le dimensioni dei vari numeri interi sulla tua piattaforma e creerà typedef per le dimensioni comuni: 8, 16, 32 e 64 bit.
Devi includere inttypes.h
invece di stdint.h
perché long
non è disponibile su alcune piattaforme come Solaris e int
includerà <=> per te su sistemi come Linux.
Se includi <=> il tuo codice è più portabile tra Linux e Solaris.
Questo link spiega cosa sto dicendo: Link IBM sui tipi di dati portatili
Se stdint.h non è disponibile per il tuo sistema, creane uno tuo. Ho sempre un file chiamato & Quot; types.h & Quot; che hanno typedef per tutti i valori con segno / non firmato 8, 16 e 32 bit.
anche in base alle piattaforme di destinazione è possibile utilizzare gli autotools per il proprio sistema di generazione
vedrà se esiste stdint.h / inttypes.h e in caso contrario creerà i typedef appropriati in un " config.h "
stdint.h è la scelta ovvia, ma non è necessariamente disponibile.
Se si utilizza una libreria portatile, è possibile che fornisca già numeri interi a larghezza fissa portatili.
Ad esempio, SDL ha Sint32
(S sta per & # 8220; firmato & # 8221;) e GLib ha gint32
.
C99 o successivo
Usa <stdint.h>
.
Se l'implementazione supporta numeri interi a 32 bit del complemento di 2, è necessario definire int32_t
.
In caso contrario, la cosa migliore successiva è int_least32_t
che è un tipo intero supportato dall'implementazione che è di almeno 32 bit, indipendentemente dalla rappresentazione (complemento a due, complemento a uno, ecc.).
Esiste anche int_fast32_t
che è un tipo intero largo almeno 32 bit, scelto con l'intenzione di consentire le operazioni più veloci per tale requisito di dimensione.
ANSI C
Puoi utilizzare long
, che è garantito essere largo almeno 32 bit come risultato dei requisiti di intervallo minimo specificati dalla norma.
Se preferisci utilizzare il tipo intero più piccolo per adattare un numero a 32 bit, puoi utilizzare le istruzioni del preprocessore come le seguenti con le macro definite in <limits.h>
:
#define TARGET_MAX 2147483647L
#if SCHAR_MAX >= TARGET_MAX
typedef signed char int32;
#elif SHORT_MAX >= TARGET_MAX
typedef short int32;
#elif INT_MAX >= TARGET_MAX
typedef int int32;
#else
typedef long int32;
#endif
#undef TARGET_MAX