максимальное значение int - PullRequest
       19

максимальное значение int

159 голосов
/ 06 декабря 2009

Есть ли какой-нибудь код для поиска максимального значения целого числа (соответственно компилятору) в C / C ++, например, Integer.MaxValue функция в Java?

Ответы [ 9 ]

294 голосов
/ 06 декабря 2009

В C ++:

#include <limits>

затем используйте

int imin = std::numeric_limits<int>::min(); // minimum value
int imax = std::numeric_limits<int>::max();

std::numeric_limits - это тип шаблона, который может быть создан с другими типами:

float fmin = std::numeric_limits<float>::min(); // minimum positive value
float fmax = std::numeric_limits<float>::max();

В С:

#include <limits.h>

затем используйте

int imin = INT_MIN; // minimum value
int imax = INT_MAX;

или

#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;
25 голосов
/ 22 апреля 2015

Я знаю, что это старый вопрос, но, возможно, кто-то может использовать это решение:

int size = 0; // Fill all bits with zero (0)
size = ~size; // Negate all bits, thus all bits are set to one (1)

Пока у нас есть -1 как результат 'до размер является подписанным int.

size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.

Как сказано в стандарте, сдвинутые биты равны 1, если переменная подписана, и отрицательны, и 0, если переменная будет без знака или со знаком, и положительна.

Поскольку size подписан и отрицателен, мы будем сдвигать знаковый бит, который равен 1, что не очень помогает, поэтому мы приводим к unsigned int, заставляя вместо этого сдвигать в 0, устанавливая бит знака в 0, оставляя все остальные биты равными 1.

cout << size << endl; // Prints out size which is now set to maximum positive value.

Мы могли бы также использовать маску и xor, но тогда мы должны были знать точный размер переменной в битах. Смещая фронт битов, мы не должны знать, сколько битов int имеет на машине или компиляторе, и не должны включать дополнительные библиотеки.

15 голосов
/ 06 декабря 2009
#include <climits>
#include <iostream>
using namespace std;

int main() {
  cout << INT_MAX << endl;
}
2 голосов
/ 13 июня 2016

Вот макрос, который я использую, чтобы получить максимальное значение для целых чисел со знаком, которое не зависит от размера используемого целочисленного типа со знаком и для которого gcc -Woverflow не будет жаловаться

#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);
2 голосов
/ 22 марта 2012

Почему бы не написать кусок кода вроде:

int  max_neg = ~(1 << 31);
int  all_ones = -1;
int max_pos = all_ones & max_neg;
1 голос
/ 19 марта 2017

O.K. У меня нет ни представителя, чтобы комментировать предыдущий ответ (от Филиппа де Мюйтера), ни поднять его счет, поэтому новый пример, использующий его define для SIGNED_MAX, тривиально расширен для неподписанных типов:

// 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;

В отличие от использования того или иного заголовка, здесь мы используем реальный тип из компилятора.

0 голосов
/ 25 апреля 2019
#include <iostrema>

int main(){
    int32_t maxSigned = -1U >> 1;
    cout << maxSigned << '\n';
    return 0;
}

Возможно, это зависит от архитектуры, но это работает, по крайней мере, в моей настройке.

0 голосов
/ 22 декабря 2017

Как насчет (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2)). Это то же самое, что и 2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2).

Если 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].

Вы не можете использовать 2*(1 << (8*sizeof(int)-2)) - 1, потому что он переполнится, но (1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2)) работает.

0 голосов
/ 04 августа 2017

Для конкретного максимального значения int я обычно пишу шестнадцатеричное обозначение:

int my_max_int = 0x7fffffff;

вместо неправильного десятичного значения:

int my_max_int = 2147483647;
...