Domanda

Sono consapevole che le specifiche del linguaggio C non dettano la dimensione esatta di ciascun tipo intero (ad es. int).

Quello che mi chiedo è: esiste un modo in C (non C ++) per definire un tipo intero con una dimensione specifica che garantisca che sarà lo stesso tra architetture diverse? Come:

typedef int8 <an integer with 8 bits>
typedef int16 <an integer with 16 bits>

O qualsiasi altro modo che consenta di compilare altre parti del programma su architetture diverse.

È stato utile?

Soluzione

Quello che vuoi è <stdint.h>, che verranno implementati dai compilatori conformi allo standard C (" C99 "). Sfortunatamente, questo non include Microsoft. Fortunatamente, un progetto open source fornisce un int32_t per Windows, vedi msinttypes .

Questo ti permetterà di usare uint32_t e <=>, più 8, 16 e 64 e molti altri.

Nota: il file di intestazione stesso non è facoltativo nello standard, tuttavia, la maggior parte dei tipi nell'intestazione sono opzionali individualmente. Alcuni non lo sono. I tipi più comunemente usati sono quelli opzionali, ma nulla ti impedisce di utilizzare quelli richiesti. Il fatto è che, se un'implementazione fornisce l'intestazione, in pratica definiscono tutti i tipi.

Altri suggerimenti

C99, in stdint.h , definisce tipi come int8_t e int16_t .

No, lo standard C specifica le dimensioni minime per i tipi integrali, ma non garantisce le dimensioni massime.

Un'implementazione deve fornire i tipi intN_t se sono disponibili tipi di quelle dimensioni. Dico solo che, poiché avevi un tag multipiattaforma, un'implementazione che non ha un tipo della larghezza di bit corretta non deve fornire tali tipi.

In genere è possibile selezionare (con le impostazioni definite, ad esempio, cc -D_INT16_IS_INT e #ifdef ) il tipo corretto da utilizzare per una specifica dimensione di bit. Puoi elaborare le definizioni richieste per ogni piattaforma che desideri supportare con il codice C usando CHAR_BIT e sizeof () .

La sezione pertinente della bozza c1x (n1362) è:


7.18.1.1 Tipi interi di larghezza esatta

  1. Il nome typedef intN_t indica un tipo intero con segno con larghezza N , nessun bit di riempimento e una rappresentazione del complemento a due. Pertanto, int8_t indica un tipo intero con segno con una larghezza di esattamente 8 bit.

  2. Il nome typedef uintN_t indica un tipo intero senza segno con larghezza N . Pertanto, uint24_t indica un tipo intero senza segno con una larghezza di esattamente 24 bit.

  3. Questi tipi sono opzionali. Tuttavia, se un'implementazione fornisce tipi interi con larghezze di 8, 16, 32 o 64 bit, nessun bit di riempimento e (per i tipi con segno) che hanno una rappresentazione di complemento a due, deve definire i corrispondenti nomi di typedef .


Per quanto riguarda la selezione dei tipi, dovrebbe bastare qualcosa del genere:

#ifdef INT32_IS_SHORT
    typedef short INT32
#endif
#ifdef INT32_IS_INT
    typedef int INT32
#endif
#ifdef INT32_IS_LONG
    typedef long INT32
#endif

A meno che non si controlli ogni piattaforma con #ifdef o giù di lì, dubito che sia facilmente possibile. Ma molte biblioteche fanno già questo compito per te. Per MSVC è __int8 , __int16 , & amp; c. La libreria GTK ha caratteri tipografici simili.

Potresti dare un'occhiata a pstdint.h . È un'implementazione portatile di stdint.h e non richiede il supporto del compilatore C99.

Per quanto ne so, la risposta è no. Codifichiamo per piattaforme diverse e usiamo solo typedefs per piattaforme specifiche usando # if / # else. Ad esempio su Win32: typedef int int32;

Puoi sempre scrivere una libreria aritmetica che utilizza i vettori di caratteri non firmati per i numeri. In questo modo è possibile utilizzare numeri di qualsiasi lunghezza di bit desiderata e persino variare la lunghezza dei bit.

In realtà, non è necessario implementare una libreria del genere perché GNU MP lo gestisce già.

http://gmplib.org/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top