HOWTO · C++
Expressões de macro INT_MAX e INT_MIN em C++
Este artigo apresenta como utilizar as expressões macro INT_MAX e INT_MIN em C++
Nesta página
INT_MIN e INT_MAX são, respectivamente, o menor e o maior valor que o tipo int pode representar na implementação. Inclua <climits> para usar essas macros em C++; como os valores dependem da implementação, consulte-os em vez de presumir números específicos de uma plataforma.
O que INT_MIN e INT_MAX significam em C++
As duas macros descrevem o intervalo de int: INT_MIN é o limite inferior e INT_MAX, o superior. Esse intervalo é definido pela implementação de C++ e não garante que todas as máquinas usem os mesmos valores numéricos. Essas macros se aplicam a int; elas não descrevem os tipos long, short nem os tipos inteiros sem sinal. O cabeçalho <climits> também fornece macros relacionadas, como LONG_MIN, LONG_MAX e UINT_MAX, quando esses tipos forem relevantes.
As macros permitem que o código use os limites definidos pela implementação. Isso é mais portável do que inserir um valor decimal conhecido em uma comparação ou definição de intervalo. Elas informam os limites, mas não tornam a aritmética segura por si só.
Consulte os limites de inteiros com <climits>
Inclua <climits> para usar as macros de limites de inteiros. Este exemplo completo imprime os dois limites de int, sem presumir valores decimais específicos:
Execute este exemplo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
#include <climits>
#include <iostream>
int main() {
std::cout << "INT_MIN = " << INT_MIN << '\n';
std::cout << "INT_MAX = " << INT_MAX << '\n';
}
INT_MIN = -2147483648
INT_MAX = 2147483647
Estes são os valores observados no ambiente testado; sua implementação pode imprimir limites diferentes. Se precisar dos limites de outro tipo inteiro, use a macro correspondente de <climits> em vez de reutilizar os limites de int.
Gere um int aleatório em todo o intervalo
std::uniform_int_distribution<int> aceita limites inferior e superior inclusivos. Portanto, passar INT_MIN e INT_MAX solicita valores em todo o intervalo de int. Um mecanismo aleatório fornece a sequência; a distribuição mapeia os resultados do mecanismo para o intervalo solicitado.
Execute este exemplo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
#include <climits>
#include <iostream>
#include <random>
int main() {
std::mt19937 engine(42);
std::uniform_int_distribution<int> distribution(INT_MIN, INT_MAX);
for (int count = 0; count < 5; ++count) {
std::cout << distribution(engine) << '\n';
}
}
-538846106
1273642419
1935803228
-1359637234
996406378
Esta é a saída observada no ambiente testado. A semente fixa torna repetível o estado inicial do mecanismo, mas os valores exatos da distribuição podem variar entre implementações de bibliotecas padrão, pois os algoritmos de distribuição não precisam produzir a mesma sequência em todos os ambientes. Se a aplicação precisar de uma semente não determinística, inicialize o mecanismo com uma fonte apropriada; evite criar um mecanismo novo a cada sorteio.
Use os limites de inteiros com segurança
Uma macro de limite é útil para validar um valor ou descrever um intervalo permitido, mas verificar o resultado depois de uma operação que causou overflow é tarde demais. Para somar valores int não negativos, verifique a <= INT_MAX - b antes de calcular a + b. Para subtrair, avalie os limites inferior e superior antes do cálculo; em implementações cujo intervalo é assimétrico, não é possível representar -INT_MIN como int. Em C++, o overflow de inteiros com sinal tem comportamento indefinido, portanto não dependa de que ele produza outro valor por retorno ao início do intervalo.
Se um cálculo puder ultrapassar o intervalo de int, escolha um tipo com capacidade suficiente ou use aritmética verificada antes de realizar a operação. O tipo mais amplo também precisa comportar o resultado do cálculo. INT_MIN e INT_MAX são valores de limite úteis para testes e verificações, mas não impedem overflow sem lógica que confira as entradas antes da operação aritmética.