Existe algum código para encontrar o valor máximo de número inteiro (de acordo com o compilador) em C / C ++ como Integer.MaxValue
função em java?
int
por long long int
na resposta Gregories ...
-pedantic
) o suportam.
Existe algum código para encontrar o valor máximo de número inteiro (de acordo com o compilador) em C / C ++ como Integer.MaxValue
função em java?
int
por long long int
na resposta Gregories ...
-pedantic
) o suportam.
Respostas:
Em C ++:
#include <limits>
então use
int imin = std::numeric_limits<int>::min(); // minimum value
int imax = std::numeric_limits<int>::max();
std::numeric_limits
é um tipo de modelo que pode ser instanciado com outros tipos:
float fmin = std::numeric_limits<float>::min(); // minimum positive value
float fmax = std::numeric_limits<float>::max();
Em C:
#include <limits.h>
então use
int imin = INT_MIN; // minimum value
int imax = INT_MAX;
ou
#include <float.h>
float fmin = FLT_MIN; // minimum positive value
double dmin = DBL_MIN; // minimum positive value
float fmax = FLT_MAX;
double dmax = DBL_MAX;
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.
uint64_t
e int64_t
, não de int
.
#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
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 = (unsigned int)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.
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
#include <climits>
#include <iostream>
using namespace std;
int main() {
cout << INT_MAX << endl;
}
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
#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);
long long e = SIGNED_MAX(e);
Por que não escrever um pedaço de código como:
int max_neg = ~(1 << 31);
int all_ones = -1;
int max_pos = all_ones & max_neg;
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(unsigned int) // on ARM: 4294967295
// then we can have:
unsigned int width = UINT_MAX;
Ao contrário do uso deste ou daquele cabeçalho, aqui usamos o tipo real do compilador.
Que tal (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))
. É o mesmo que 2^(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.