Observe que o ponto flutuante miné o valor positivo mínimo , enquanto que o número inteiro miné o valor mínimo. O mesmo vale para as macros / constantes C.
dalle
4
em C99 você também pode usar UINT64_MAX e INT64_MAX
Dmitry Vyal
3
@DmitryVyal: Sim, você pode, mas esses são os limites de uint64_te int64_t, não de int.
Keith Thompson
Em C ++, usei o mesmo código mostrado acima: #include <limits>e int imax = std::numeric_limits<int>::max();, mas recebo o erro Can't resolve struct member 'max'. Alguma idéia de por que isso ocorre e como corrigi-lo? Estou usando o IDE IDE, com CMake e C ++ 11 no Ubuntu 14.04. Eu acho que ela está ligada a esta questão
modulitos
1
Espero que isso ajude alguém, porque era um bug CLION IDE que eu fixo usando a mais recente CLION (construção 138,2344 - CLION está na fase Early Access Program, e assim instáveis)
modulitos
30
Eu sei que é uma pergunta antiga, mas talvez alguém possa usar esta solução:
int size =0;// Fill all bits with zero (0)
size =~size;// Negate all bits, thus all bits are set to one (1)
Até agora, temos -1 como resultado, até que o tamanho seja um int assinado.
size =(unsignedint)size >>1;// Shift the bits of size one position to the right.
Como o Standard diz, os bits inseridos são 1 se a variável for assinada e negativa e 0 se a variável não for assinada ou assinada e positiva.
Como o tamanho é assinado e negativo, mudaríamos o bit de sinal que é 1, o que não está ajudando muito, então convertemos para int sem sinal, forçando o deslocamento em 0, definindo o bit de sinal como 0 e deixando todos os outros bits permanecerem 1.
cout << size << endl;// Prints out size which is now set to maximum positive value.
Também poderíamos usar uma máscara e xor, mas precisávamos saber o tamanho exato de bits da variável. Com a mudança de bits à frente, não precisamos saber quantos bits o int tem na máquina ou no compilador nem precisamos incluir bibliotecas extras.
Eu não chamaria INT_MAX "uma solução para C". É antiquado e obsoleto em C ++.
Paul Tomblin 6/12/2009
6
Eu acho que ambos são respostas C ++. numeric_limits<int>::max()- funciona também em contextos de modelo, mas (por algum motivo insondável para mim) não pode ser usado como uma constante em tempo de compilação. INT_MAX- é uma macro, bastante inútil nas funções de modelo, mas pode ser usada como uma constante em tempo de compilação.
UncleBens 06/12/2009
17
O engraçado é que a implementação numeric_limits <int> :: max no msvc se parece com isso: return (INT_MAX);
Nikola Smiljanić
13
@paul Referência para a suspensão, por favor. E adivinhe como numeric_limits implementa max ()? É isso mesmo, "retorne INT_MAX", pelo menos no GCC 4.4.0.
2
@UncleBens: as funções em linha atualmente não podem ser reduzidas a expressões constantes.
Georg Fritzsche
1
Aqui está uma macro que eu uso para obter o valor máximo para números inteiros assinados, que é independente do tamanho do tipo inteiro assinado usado e para o qual gcc -Woverflow não irá reclamar
#define SIGNED_MAX(x)(~(-1<<(sizeof(x)*8-1)))int a = SIGNED_MAX(a);long b = SIGNED_MAX(b);char c = SIGNED_MAX(c);/* if char is signed for this target */short d = SIGNED_MAX(d);longlong e = SIGNED_MAX(e);
Não há garantia de que int tenha tamanho de 32 bits e não há garantia sobre o formato inteiro negativo na memória. Menos importante, não há necessidade de fazer as pessoas procurarem '~'.
Sqeaky
0
OK Eu não tenho representante para comentar a resposta anterior (de Philippe De Muyter) nem aumentar sua pontuação; portanto, um novo exemplo usando sua definição para SIGNED_MAX estendida trivialmente para tipos não assinados:
// We can use it to define limits based on actual compiler built-in types also: #define INT_MAX SIGNED_MAX(int)// based on the above, we can extend it for unsigned types also:#define UNSIGNED_MAX(x)((SIGNED_MAX(x)<<1)|1)// We reuse SIGNED_MAX#define UINT_MAX UNSIGNED_MAX(unsignedint)// on ARM: 4294967295// then we can have:unsignedint width = UINT_MAX;
Ao contrário do uso deste ou daquele cabeçalho, aqui usamos o tipo real do compilador.
int
porlong long int
na resposta Gregories ...-pedantic
) o suportam.Respostas:
Em C ++:
então use
std::numeric_limits
é um tipo de modelo que pode ser instanciado com outros tipos:Em C:
então use
ou
fonte
min
é o valor positivo mínimo , enquanto que o número inteiromin
é o valor mínimo. O mesmo vale para as macros / constantes C.uint64_t
eint64_t
, não deint
.#include <limits>
eint imax = std::numeric_limits<int>::max();
, mas recebo o erroCan't resolve struct member 'max'
. Alguma idéia de por que isso ocorre e como corrigi-lo? Estou usando o IDE IDE, com CMake e C ++ 11 no Ubuntu 14.04. Eu acho que ela está ligada a esta questãoEu sei que é uma pergunta antiga, mas talvez alguém possa usar esta solução:
Até agora, temos -1 como resultado, até que o tamanho seja um int assinado.
Como o Standard diz, os bits inseridos são 1 se a variável for assinada e negativa e 0 se a variável não for assinada ou assinada e positiva.
Como o tamanho é assinado e negativo, mudaríamos o bit de sinal que é 1, o que não está ajudando muito, então convertemos para int sem sinal, forçando o deslocamento em 0, definindo o bit de sinal como 0 e deixando todos os outros bits permanecerem 1.
Também poderíamos usar uma máscara e xor, mas precisávamos saber o tamanho exato de bits da variável. Com a mudança de bits à frente, não precisamos saber quantos bits o int tem na máquina ou no compilador nem precisamos incluir bibliotecas extras.
fonte
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
fonte
numeric_limits<int>::max()
- funciona também em contextos de modelo, mas (por algum motivo insondável para mim) não pode ser usado como uma constante em tempo de compilação.INT_MAX
- é uma macro, bastante inútil nas funções de modelo, mas pode ser usada como uma constante em tempo de compilação.Aqui está uma macro que eu uso para obter o valor máximo para números inteiros assinados, que é independente do tamanho do tipo inteiro assinado usado e para o qual gcc -Woverflow não irá reclamar
fonte
Por que não escrever um pedaço de código como:
fonte
OK Eu não tenho representante para comentar a resposta anterior (de Philippe De Muyter) nem aumentar sua pontuação; portanto, um novo exemplo usando sua definição para SIGNED_MAX estendida trivialmente para tipos não assinados:
Ao contrário do uso deste ou daquele cabeçalho, aqui usamos o tipo real do compilador.
fonte
Pode ser dependente da arquitetura, mas funciona pelo menos na minha configuração.
fonte
Para o valor máximo específico de int , geralmente escrevo a notação hexadecimal:
em vez do valor decimal irregular:
fonte
Que tal
(1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
. É o mesmo que2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2)
.Se
sizeof(int) = 4 => 2^(8*4-2) - 1 + 2^(8*4-2) = 2^30 - 1 + 20^30 = (2^32)/2 - 1 [max signed int of 4 bytes]
.Você não pode usar
2*(1 << (8*sizeof(int)-2)) - 1
porque ele transbordará, mas(1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
funciona.fonte