Domanda

In C99, includo stdint.h e che mi dà UINT32_MAX così come uint32_t. Tuttavia, in C ++ l'UINT32_MAX viene definito fuori. Posso definire __STDC_LIMIT_MACROS prima di includere stdint.h, ma questo non funziona se qualcuno è compreso il mio colpo di testa dopo aver già compreso stdint.h stessi.

Quindi, in C ++, qual è il modo standard di scoprire la rappresentabili valore massimo in un uint32_t?

È stato utile?

Soluzione

Beh, io non so uint32_t ma per i tipi fondamentali (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double) si dovrebbe utilizzare i modelli numeric_limits via #include <limits>.

cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;

Se uint32_t è un #define di uno dei precedenti di questo codice dovrebbe funzionare out of the box

    cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;

Altri suggerimenti

std::numeric_limits<T>::max() definisce il valore massimo per il tipo T.

Bene, uint32_t sarà sempre a 32 bit, e sempre senza segno, quindi si può tranquillamente definire manualmente:

#define UINT32_MAX  (0xffffffff)

È anche possibile fare

#define UINT32_MAX  ((uint32_t)-1)

Si può essere in grado di eliminare i problemi di ordine #include modificando il processo di compilazione per definire il simbolo __STDC_LIMIT_MACROS sulla riga di comando del compilatore invece:

cxx -D__STDC_LIMIT_MACROS ...

Naturalmente, si sarebbe ancora avere problemi se un'intestazione #undefs questo simbolo.

Inoltre, l'implementazione di libreria standard gli autori che si sta utilizzando potrebbe non avere destinata agli utenti di impostare quel simbolo particolare; ci potrebbe essere una bandiera compilatore o un simbolo diverso che gli utenti hanno lo scopo di utilizzare per abilitare i tipi C99 in C ++.

Non posso commentare ecco il mio contributo su Glen vs risposta di Lior Kogan.

Se si utilizza variabili statiche vi imbatterete nel problema che se si assegna un valore costante all'interno di una classe di numeric_limits :: max () tale valore sarà infatti impostato a zero a causa dell'ordine di inizializzazione (vedere questo alberino nullo inizializzazione e l'inizializzazione statica variabile statica ambito locale )

Quindi, in questo caso funzionerà solo utilizzando la risposta di Lior Kogan.

// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan
#define UINT32_MAX  ((uint32_t)-1)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top