logo

INT_MAX і INT_MIN у C/C++ і Applications

У більшості випадків у змагальному програмуванні виникає необхідність призначити змінній максимальне чи мінімальне значення, яке може містити тип даних, але запам’ятати таке велике й точне число виявляється важкою роботою. Таким чином, C/C++ має певні макроси для представлення цих чисел, так що їх можна безпосередньо призначити змінній, фактично не вводячи ціле число.

C/C++ надає два таких макроси, а саме INT_MAX і INT_MIN, які представляють цілочисельні межі. Залежно від компілятора та стандарту C++ вам може знадобитися включити файл заголовка або у вашому вихідному коді C або C++ відповідно. Тому доцільно включити цей файл заголовка для використання макросів INT_MAX і INT_MIN. Для подальшого читання цього файлу заголовка, зверніться до цієї статті .



INT_MAX у C/C++

INT_MAX — це макрос, який вказує, що цілочисельна змінна не може зберігати жодне значення за межами цього обмеження. Він представляє максимальне значення верхньої межі цілочисельного типу даних у C/C++.

Значення INT_MAX дорівнює:

перетворення nfa в dfa
  • INT_MAX = 2147483647 (для 32-розрядних цілих чисел)
  • INT_MAX = 9,223,372,036,854,775,807 (для 64-розрядних цілих чисел)

INT_MIN у C/C++

INT_MIN — це макрос, який визначає, що цілочисельна змінна не може зберігати будь-яке значення нижче цієї межі. Він представляє мінімальне значення або нижня межа цілочисельного типу даних.



Значення INT_MIN таке:

  • INT_MIN = – 2147483648 (для 32-розрядних цілих чисел)
  • INT_MIN = – 9,223,372,036,854,775,808 (для 64-розрядних цілих чисел)

Примітка: Значення INT_MAX і INT_MIN можуть відрізнятися від компілятора до компілятора. Нижче наведено типові значення в компіляторі, де цілі числа зберігаються з використанням 32 бітів.

Приклад INT_MIN і INT_MAX

C++
// C++ program to print values of INT_MAX // and INT_MIN #include  #include  using namespace std; int main() {  cout << INT_MAX << endl;  cout << INT_MIN;  return 0; }>
C
// C program to print values of INT_MAX // and INT_MIN // we have to include limits.h for results in C #include  #include  int main() {  printf('%d
', INT_MAX);  printf('%d', INT_MIN); }>

Вихід
2147483647 -2147483648>

Застосування INT_MAX і INT_MIN

Нижче наведено основні застосування INT_MAX і INT_MIN



1. Перевірте наявність цілочисельного переповнення

Ми можемо використовувати макроси INT_MIN і INT_MAX, щоб перевірити переповнення цілого числа зі знаком. Наведений нижче приклад демонструє, як це зробити.

приклад

C++
// C++ code to check for Integer overflow while // adding 2 numbers #include  #include  using namespace std; // Function to return integer sum after checking overflow int check_overflow(int num1, int num2) {  // Checking if addition will cause overflow  if (num1>INT_MAX - num2) повернення -1;  // Переповнення не відбулося, інакше return num1 + num2; } // Код драйвера int main() { // Сума цих чисел дорівнюватиме INT_MAX // Якщо будь-яке з них збільшиться на 1, // відбудеться переповнення int num1 = 2147483627;  int num2 = 20;  // Результат -1, якщо сталося переповнення // Зберігає суму, інакше int result = check_overflow(num1, num2);  // Сталося переповнення, якщо (результат == -1) cout<< 'Integer overflow occurred';  // No overflow  else  cout << result;  return 0; }>
C
// C code to check for Integer overflow while // adding 2 numbers #include  #include  // Function to check integer overflow int check_overflow(int num1, int num2) {  // Checking if addition will cause overflow  if (num1>INT_MAX - num2) повернення -1;  // Переповнення не відбулося, інакше return num1 + num2; } int main(void) { // Сума цих чисел буде еквівалентною // INT_MAX Якщо будь-яке з них збільшиться на 1, // відбудеться переповнення int num1 = 2147483627;  int num2 = 20;  // Результат -1, якщо сталося переповнення // Зберігає суму, інакше int result = check_overflow(num1, num2);  // Сталося переповнення if (result == -1) printf('Сталося переповнення цілого числа');  // Без переповнення else printf('%d', результат);  повернути 0; } // Цей код надав sarajadhav12052009>

Вихід
2147483647>

Так само ми можемо перевірити переповнення під час віднімання 2 чисел за допомогою INT_MIN.

розмір шрифту в латексі

2. Обчислення MIN в масиві з великими елементами

Зазвичай ми призначаємо високе значення MIN, щоб обчислити мінімальне значення в масиві. Але якщо масив має великі елементи, ми повинні призначити максимально можливе значення масиву.

Нижче наведено реалізацію:

приклад

C++
// C++ code to compute MIN element #include  #include  using namespace std; // Function to compute minimum element in array int compute_min(int arr[], int n) {  // Assigning highest value  int MIN = INT_MAX;  // Traversing and updating MIN  for (int i = 0; i < n; i++)  MIN = std::min(MIN, arr[i]);  // Printing MIN element  cout << MIN; } // Driver code int main() {  // array with MIN to compute  int arr[] = { 2019403813, 2147389580, 2145837140,  2108938594, 2112076334 };  // size of array  int n = sizeof(arr) / sizeof(arr[0]);  // Function call to compute MIN  compute_min(arr, n); }>

Вихід
2019403813>

Так само MAX можна знайти в масиві великих чисел за допомогою INT_MIN.

Поширені запитання про INT_MIN і INT_MAX

1. Чому abs(INT_MIN) не дає очікуваного результату?

Ви коли-небудь стикалися з проблемою, коли використовували функцію abs()? Швидше за все, НІ, якщо ви не розв’язали жодної проблеми, яка потребує абсолютної функції. Але якщо ви вирішували проблеми на techcodeview.com або Leetcode, то ви знаєте, що завжди є один тестовий випадок, у якому ви зазнаєте невдачі, і цей тестовий випадок — це коли у вас є значення INT_MIN.

Давайте подивимося, що станеться, якщо ми використаємо абсолютну функцію, яка повертає значення mod, тобто повертає таке значення:

символи екранування java

Значення модуля

Інша річ, яку ми знаємо, це діапазон цілих чисел від -2 147 483 648 до 2 147 483 647 або ми можемо сказати, що це від -2 31 до 2 31 - 1 так як ми бачимо, що є завжди на одну більше негативної сторони, ніж позитивної

Тепер давайте подивимося, що станеться, коли ми спробуємо взяти абсолютні значення результату:

C++
// C++ program to demonstrate the common error faced when // getting absolute value of the INT_MIN #include  #include  using namespace std; int main() {  cout << 'Value Of INT_MIN is : ' << INT_MIN << endl;  cout << 'Value Of abs(INT_MIN) is : ' << abs(INT_MIN)  << endl;  return 0; }>
C
// C program to demonstrate the common error faced when // getting absolute value of the INT_MIN #include  #include  #include  int main() {  printf('Value of INT_MIN is: %d
', INT_MIN);  printf('Value of abs(INT_MIN) is: %d', abs(INT_MIN));  return 0; }>

Вихід
Value of INT_MIN is: -2147483648 Value of abs(INT_MIN) is: -2147483648>

Тепер ми можемо спостерігати, що abs(INT_MIN) дорівнює INT_MIN, і це спричиняє виникнення багатьох помилок, коли ми проводимо онлайн-оцінювання або вирішуємо будь-яку проблему.

c програми

Причина

Тепер, якщо ми перейдемо до частини причини, ми побачимо, що зараз ми маємо справу з частиною Integer, і abs(integer) повертає ціле значення, тому перехід до представлення INT_MIN можна представити як

INT_MIN = -2147483648 = 10000000000000000000000000000000>

Тут 1-й біт представляє знаковий біт, який встановлено в одиницю, що означає від’ємне число, а наступна частина — 31-бітне двійкове представлення для 2147483648.

Тепер, якщо ми спробуємо взяти абсолютне значення INT_MIN, воно спробує дати нам +2147483648, і це значення не можна представити у формі цілого числа, оскільки максимальне значення, яке можна представити, становить +2147483647, оскільки з позитивної сторони ми повинні представляють 231 ціле число, але також включено 0, тому діапазон від 1 до 2147483648 змінюється на 0 до 2147483647, і з цієї причини abs(INT_MIN) не може бути представлено в цьому діапазоні, і повертається відповідь така сама, як INT_MIN.

Рішення

Що ж, може бути багато рішень проблеми, але деякі з найкращих рішень:

  1. Завжди використовуйте спеціальний крайовий випадок для перевірки if(x == INT_MIN), якщо ви використовуєте abs(x), і обробляйте цей випадок відповідно.
  2. Спробуйте використовувати Long замість INTEGER, але пам’ятайте, що LONG_MIN також дасть той самий результат, тому будьте обережні.