¿Cuál es el equivalente de UINT32_MAX C ++?
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?
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 #undef
s 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)