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


177

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


1
чи є спосіб знайти максимальне значення long long int ??
d3vdpro

Просто замініть intз long long intв Gregories відповідь ...
Georg Фриче

1
за винятком того, що довгий довгий не є частиною C ++


@Neil, правда, його C99 - але VC і GCC (без -pedantic) підтримують його.
Георг Фріцше

Відповіді:


323

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

13
Зауважте, що плаваюча точка min- це мінімальне додатне значення, де як ціле число minє мінімальне значення. Те саме стосується і макросів / констант C.
Далле

4
у C99 ви також можете використовувати UINT64_MAX та INT64_MAX
Дмитро Віль

3
@DmitryVyal: Так, можна, але це межі uint64_tта int64_t, а не int.
Кіт Томпсон

У C ++ я використовував той самий код, який показано вище: #include <limits>і int imax = std::numeric_limits<int>::max();, але я отримую помилку Can't resolve struct member 'max'. Будь-які ідеї, чому це відбувається, і як це виправити? Я використовую CLion IDE, з CMake та C ++ 11 на Ubuntu 14.04. Я думаю, що це пов'язано з цим питанням
modulitos

1
Сподіваємось, це комусь допомагає, адже це була помилка ID CLion, яку я виправив за допомогою останньої програми CLion (збірка 138.2344 - CLion знаходиться у фазі програми раннього доступу та, таким чином, нестабільний)
modulitos

30

Я знаю, що це старе питання, але, можливо, хтось може скористатися цим рішенням:

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

Поки що у нас -1 як результат, поки розмір не буде підписаним.

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

Як говорить Стандарт, біти, які зміщені, - 1, якщо змінна підписана і негативна, і 0, якщо змінна буде непідписаною або підписаною та позитивною.

Оскільки розмір підписаний і негативний, ми змістимо біт знаків, який дорівнює 1, що не дуже допомагає, тому ми переходимо до непідписаного int, змушуючи замість нього зміщувати 0, встановлюючи біт знака 0, а всі інші біти залишаються 1.

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

Ми також могли використовувати маску та xor, але тоді ми повинні були знати точний біт змінної. Зсуваючи біти спереду, нам не потрібно в будь-який час знати, скільки біт має int на машині чи компіляторі, і не потрібно включати додаткові бібліотеки.


1
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
Вбивця

15
#include <climits>
#include <iostream>
using namespace std;

int main() {
  cout << INT_MAX << endl;
}

1
Я б не назвав INT_MAX "рішенням для C". Це, однак, старе школа і застаріло в C ++.
Пол Томблін

6
Я думаю, що обидва відповіді на С ++. numeric_limits<int>::max()- працює також у контекстах шаблонів, але (з якихось незрозумілих мені причин) не може використовуватися як константа часу компіляції. INT_MAX- є макросом, досить марним у функціях шаблону, але може використовуватися як константа часу компіляції.
UncleBens

17
Найсмішніше, що numeric_limits <int> :: max реалізація у msvc виглядає так: return (INT_MAX);
Микола Сміляніч

13
@paul Довідка про анулювання, будь ласка. І здогадайтесь, як numeric_limits реалізує max ()? Правильно, "поверніть INT_MAX", принаймні на GCC 4.4.0.

2
@UncleBens: вбудовані функції в даний час не можна звести до постійних виразів.
Георг Фрітше

1

Ось макрос, який я використовую, щоб отримати максимальне значення для підписаних цілих чисел, яке не залежить від розміру використовуваного цілого цілого типу, і на яке 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);

1

Чому б не написати фрагмент коду, наприклад:

int  max_neg = ~(1 << 31);
int  all_ones = -1;
int max_pos = all_ones & max_neg;

28
Немає гарантії, що розмір int має 32 біти, і немає гарантії щодо формату негативного цілого числа в пам'яті. Що менш важливо, немає потреби змушувати людей шукати '~'.
Sqeaky

0

Гаразд Я не маю жодної репутації, щоб коментувати попередню відповідь (Філіппа Де Мюйтера), ні піднімати її бал, отже новий приклад, використовуючи його визначення для 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
#include <iostrema>

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

Це може залежати від архітектури, але воно працює принаймні в моїх налаштуваннях.


-1

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

int my_max_int = 0x7fffffff;

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

int my_max_int = 2147483647;

-1

Про що (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))працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.