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?

Foi útil?

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 #undefs 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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top