Qual é o C ++ equivalente a UINT32_MAX?
Pergunta
Em C99, incluo stdint.h e isso me dá UINT32_MAX, bem como uint32_t. No entanto, em C ++ o UINT32_MAX fica definido para fora. Posso definir __STDC_LIMIT_MACROS antes de incluir stdint.h, mas isso não funciona se alguém está incluindo meu cabeçalho depois de já incluindo stdint.h si mesmos.
Assim, em C ++, que é a maneira padrão de descobrir o valor máximo representável em um uint32_t?
Solução
Bem, eu não sei sobre uint32_t
mas para os tipos fundamentais (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double
) você deve usar os modelos 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
é um #define
de um dos acima do que este código deve funcionar fora da caixa
cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;
Outras dicas
std::numeric_limits<T>::max()
define o valor máximo para o tipo T
.
Bem, uint32_t será sempre de 32 bits, e sempre ser assinado, para que você possa defini-lo com segurança manualmente:
#define UINT32_MAX (0xffffffff)
Você também pode fazer
#define UINT32_MAX ((uint32_t)-1)
Você pode ser capaz de eliminar os problemas de ordem #include
alterando seu processo de construção para definir o símbolo __STDC_LIMIT_MACROS
na linha de comando do compilador em vez disso:
cxx -D__STDC_LIMIT_MACROS ...
Claro, você ainda teria problemas se um cabeçalho #undef
s este símbolo.
Além disso, os autores da implementação da biblioteca padrão que você está usando pode não ter destinado a usuários de conjunto que determinado símbolo; pode haver uma bandeira compilador ou um símbolo diferente que os usuários têm a intenção de uso para permitir tipos de C99 em C ++.
Não posso comentar isso aqui é a minha entrada em Glen vs resposta de Lior Kogan.
Se você estiver usando variáveis ??estáticas que você vai correr para o problema que se você atribuir um valor constante dentro de uma classe para numeric_limits :: max () esse valor será em conjunto verdade a zero por causa da ordem de inicialização (ver isso postar inicialização zero e inicialização estática da variável âmbito local estático )
Então, nesse caso, só irá funcionar usando a resposta 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)