Pregunta

En el C99, que incluyen stdint.h y eso me da UINT32_MAX, así como uint32_t. Sin embargo, en C ++ la UINT32_MAX se define a cabo. Puedo definir __STDC_LIMIT_MACROS antes de incluir stdint.h, pero esto no funciona si alguien está incluyendo el encabezado de mi después de que ya incluye stdint.h sí mismos.

Así que en C ++, ¿cuál es la forma estándar de averiguar lo representable máximo valor en un uint32_t?

¿Fue útil?

Solución

Bueno, yo no sé nada de uint32_t pero para los tipos fundamentales (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double) se debe utilizar las plantillas numeric_limits través #include <limits>.

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

Si uint32_t es un #define de uno de los anteriores que este código debería funcionar fuera de la caja

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

Otros consejos

std::numeric_limits<T>::max() define el valor máximo para el tipo T.

Bueno, uint32_t siempre habrá 32 bits, y siempre estar sin firmar, por lo que se puede definir con seguridad de forma manual:

#define UINT32_MAX  (0xffffffff)

También se puede hacer

#define UINT32_MAX  ((uint32_t)-1)

Usted puede ser capaz de eliminar los problemas de orden #include cambiando su proceso de construcción para definir el símbolo __STDC_LIMIT_MACROS en la línea de comandos del compilador en su lugar:

cxx -D__STDC_LIMIT_MACROS ...

Por supuesto, todavía tendría problemas si una cabecera #undefs este símbolo.

Además, los autores de la implementación de la biblioteca estándar que está utilizando no se habrían destinado a los usuarios para establecer ese símbolo en particular; podría ser una bandera compilador o un símbolo diferente que los usuarios tienen la intención de utilizar para permitir que los tipos de C99 en C ++.

No puedo comentar aquí está mi entrada en Glen vs respuesta de Lior Kogan.

Si está utilizando variables estáticas que se ejecutará en el problema de que si asigna un valor constante dentro de una clase a numeric_limits :: max () ese valor será, de hecho, se establece en cero debido a la orden de inicialización (ver este poste cero de inicialización y la inicialización estática de ámbito local variable estática )

Así que en ese caso sólo funcionará mediante el uso de la respuesta de 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top