Tipi come uint32, int32, uint64, int64 sono definiti in qualsiasi intestazione stdlib?


94

Vedo spesso codice sorgente che utilizza tipi come uint32, uint64 e mi chiedo se debbano essere definiti dal programmatore nel codice dell'applicazione o se siano definiti in un'intestazione lib standard.

Qual è il modo migliore per avere questi tipi nel codice sorgente della mia applicazione?

Risposte:


135

Il C99 le stdint.hdefinisce:

  • int8_t
  • int16_t
  • int32_t
  • uint8_t
  • uint16_t
  • uint32_t

E, se l'architettura li supporta:

  • int64_t
  • uint64_t

Ci sono anche vari altri typedef interi stdint.h.

Se sei bloccato senza un ambiente C99, dovresti probabilmente fornire i tuoi typedef e usare comunque quelli C99.

Il uint32e uint64(cioè senza il _tsuffisso) sono probabilmente specifici dell'applicazione.


16
Questa risposta è sbagliata. Tutto quanto sopra è disponibile solo se nell'implementazione esiste un tipo di larghezza esatto di quella dimensione (nessun riempimento). Anche in caso contrario, tuttavia, i tipi int_leastNN_te uint_leastNN_tper NN8, 16, 32 e 64 devono sempre esistere . C99 non consente implementazioni senza un tipo intero di almeno 64 bit, poiché long longè necessario che sia almeno così grande.
R .. GitHub STOP HELPING ICE

@R ..: Sarebbe corretto dire "POSIX stdint.h" invece di "C99 stdint.h"?
mu è troppo corto

1
POSIX stdint.hli richiede tutti.
R .. GitHub STOP AIUTO AL GHIACCIO

1
@R .., puoi modificare questa risposta per correttezza? Mi ci è voluto un po 'per analizzare la combinazione di contenuto corrente e commenti.
merlin2011

SDL definisce alias tale alias typedef uint32_t Uint32;in include / SDL_stdinc.h (se sei un utente SDL)
Et7f3XIV

10

Questi tipi interi sono tutti definiti in stdint.h


Non è stdint.hspecifico dell'implementazione? Vedi anche questa domanda e questa domanda
Chris Frederick

3
Guardando il file ho trovato "ISO C99: 7.18 Integer types <stdint.h>" nei commenti. Suppongo che tu ottenga stdint.hse rispetti lo standard C99.
philix

Non trovo nessuno di loro stdint.h. Ciò restituisce 0 risultati: grep uint32 /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h | grep -v uint32_t.
jww

1
@ jww: Nel mio caso, quel file contiene #include "stdint-gcc.h"e grepping quel file produce le definizioni.
Victor Zamanian

1
@ jww sì, non esistono. Gli unici che sono standard e che dovrebbero essere definiti sono quelli con il _tsuffisso, come elencato nella risposta sopra.
Victor Zamanian

2

Se stai usando C99 includi semplicemente stdint.h. A proposito, i tipi a 64 bit ci sono se e solo se il processore li supporta.


Si prega di citare qualcosa al riguardo.
BiGYaN

6
x86 non supporta la matematica a 64 bit ma ha i tipi a 64 bit.
R .. GitHub STOP HELPING ICE

2
Sì lo fa. Supporta 32 bit x 32 bit -> moltiplicazione a 64 bit, 64 bit / 32 bit -> quoziente a 32 bit e divisione del resto a 32 bit, oltre ad aggiungere con riporto e sottrarre con istruzioni di prestito. È stato costruito per essere in grado di eseguire operazioni aritmetiche a 64 bit, se non altro perché l'8086 doveva essere in grado di eseguire operazioni aritmetiche a 32 bit.
Michael Morris

C'è anche un uint128_tif __SIZEOF_INT128__definito a 16 o maggiore (GCC e compatibili). È disponibile su macchine x86_64 / amd64, ma il processore non lo supporta in modo nativo. Solo i Cray hanno quella dimensione di registro, IIRC.
jww

0

L'interrogante ha effettivamente chiesto informazioni su int16 (ecc.) Piuttosto che (brutto) int16_t (ecc.).

Non ci sono intestazioni standard, né nessuna nella cartella / usr / include / di Linux che le definisca senza "_t".

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.