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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top