De cele mai multe ori, în programarea competitivă, este nevoie să se atribuie variabilei, valoarea maximă sau minimă pe care o poate deține tipul de date, dar amintirea unui număr atât de mare și precis se dovedește a fi o treabă dificilă. Prin urmare, C/C++ are anumite macrocomenzi pentru a reprezenta aceste numere, astfel încât acestea să poată fi atribuite direct variabilei fără a introduce efectiv întregul număr.
C/C++ oferă două astfel de macrocomenzi și anume INT_MAX și INT_MIN care reprezintă limitele întregului. În funcție de compilator și de standardul C++, vi se poate solicita să includeți fișierul antet sau în codul sursă C sau, respectiv, C++. Prin urmare, este recomandabil să includeți acest fișier antet pentru utilizarea macrocomenzilor INT_MAX și INT_MIN. Pentru citiri suplimentare despre acest fișier antet, consultați acest articol .
INT_MAX în C/C++
INT_MAX este o macrocomandă care specifică că o variabilă întreagă nu poate stoca nicio valoare dincolo de această limită. Acesta reprezintă valoarea maximă a limitei superioare a tipului de date întreg în C/C++.
Valoarea lui INT_MAX este:
arhitectura java
- INT_MAX = 2147483647 (pentru numere întregi pe 32 de biți)
- INT_MAX = 9.223.372.036.854.775.807 (pentru numere întregi pe 64 de biți)
INT_MIN în C/C++
INT_MIN este o macrocomandă care specifică faptul că o variabilă întreagă nu poate stoca nicio valoare sub această limită. Acesta reprezintă valoarea minimă sau limita inferioară a tipului de date întreg.
Valoarea lui INT_MIN este:
- INT_MIN = – 2147483648 (pentru numere întregi pe 32 de biți)
- INT_MIN = – 9.223.372.036.854.775.808 (pentru numere întregi pe 64 de biți)
Notă: Valorile INT_MAX și INT_MIN pot varia de la compilator la compilator. Următoarele sunt valori tipice într-un compilator în care numerele întregi sunt stocate folosind 32 de biți.
Exemplu de INT_MIN și 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); }>
Ieșire
2147483647 -2147483648>
Aplicații ale INT_MAX și INT_MIN
Următoarele sunt aplicațiile majore ale INT_MAX și INT_MIN
1. Verificați dacă există depășirea întregului
Putem folosi macrocomenzile INT_MIN și INT_MAX pentru a verifica depășirea întregului semnat. Exemplul de mai jos demonstrează cum se face.
șir de matrice java
Exemplu
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) returnează -1; // Nu a avut loc depășirea, altfel returnează num1 + num2; } // Cod driver int main() { // Suma acestor numere va fi egală cu INT_MAX // Dacă oricare dintre ele este incrementat cu 1, overflow // va avea loc int num1 = 2147483627; int num2 = 20; // Rezultatul este -1 dacă a avut loc depășirea // Stochează suma, în caz contrar int rezultat = check_overflow(num1, num2); // A avut loc depășirea dacă (rezultat == -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) returnează -1; // Nu a avut loc depășirea, altfel returnează num1 + num2; } int main(void) { // Suma acestor numere va fi echivalentă cu // INT_MAX Dacă oricare dintre ele este incrementat cu 1, overflow // va avea loc int num1 = 2147483627; int num2 = 20; // Rezultatul este -1 dacă a avut loc depășirea // Stochează suma, în caz contrar int rezultat = check_overflow(num1, num2); // A avut loc depășirea dacă (rezultat == -1) printf('A avut loc depășirea întregului'); // Fără overflow altfel printf('%d', rezultat); întoarce 0; } // Acest cod este contribuit de sarajadhav12052009>>
Ieșire 2147483647>
În mod similar, putem verifica depășirea în timp ce scădem 2 numere folosind INT_MIN.
2. Calcularea MIN într-o matrice cu elemente mari
De obicei, atribuim o valoare mare lui MIN pentru a calcula valoarea minimă într-o matrice. Dar dacă o matrice are elemente mari, trebuie să atribuim cea mai mare valoare posibilă matricei.
Mai jos este implementarea:
Exemplu
căutarea contradictorieC++
// 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); }>
Ieșire
Întrebări frecvente despre INT_MIN și INT_MAX
1. De ce abs(INT_MIN) nu dă rezultatul așteptat?
Te-ai confruntat vreodată cu o problemă când s-ar putea să fi folosit funcția abs()? Cel mai probabil NU dacă nu ați rezolvat nicio problemă care necesită o funcție absolută. Dar dacă ați rezolvat probleme pe techcodeview.com sau Leetcode, atunci știți că întotdeauna există un caz de testare în care nu reușiți și acel caz de testare este atunci când aveți valoarea ca INT_MIN.
Să vedem ce se întâmplă dacă folosim funcția absolută, returnează valoarea mod, ceea ce înseamnă că returnează următoarea valoare:

Valorile modulului
Acum, un alt lucru pe care îl știm este că intervalul întregului este de la -2.147.483.648 la 2.147.483.647 sau putem spune că este de la -2 31 la 2 31 - 1 ca să vedem că există întotdeauna unul mai mult pe partea negativă decât pe cea pozitivă
Acum să vedem ce se întâmplă când încercăm să luăm valori absolute ale rezultatului:
matrice de structură în limbajul cC++
// 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; }>
Ieșire
Value of INT_MIN is: -2147483648 Value of abs(INT_MIN) is: -2147483648>
Acum putem observa că abs(INT_MIN) este INT_MIN în sine, iar acest lucru provoacă să apară multe erori atunci când dăm orice evaluări online sau rezolvăm orice problemă.
Motiv
Acum, dacă ajungem la partea motiv, putem vedea că în prezent avem de-a face cu partea Întregă și abs(integer) returnează în sine o valoare întreagă, deci deplasarea lângă reprezentarea INT_MIN poate fi reprezentată ca
INT_MIN = -2147483648 = 10000000000000000000000000000000>
Aici, primul bit reprezintă bitul de semn care este setat la unul, ceea ce înseamnă că este un număr negativ, iar partea următoare este o reprezentare binară de 31 de biți pentru 2147483648.
Acum, dacă încercăm să luăm valoarea absolută a lui INT_MIN, va încerca să ne dea +2147483648 și această valoare nu poate fi reprezentată sub formă de întreg, deoarece valoarea maximă care poate fi reprezentată este +2147483647, deoarece în partea pozitivă trebuie să reprezintă 231 numere întregi, dar 0 este de asemenea inclus, astfel încât intervalul de la 1 la 2147483648 se schimbă la 0 la 2147483647 și din acest motiv abs(INT_MIN) nu poate fi reprezentat în acest interval și răspunsul returnat este același cu INT_MIN.
Soluţie
Ei bine, ar putea exista multe soluții la problemă, dar unele dintre cele mai bune soluții sunt:
- Utilizați întotdeauna un caz de margine special pentru a verifica dacă (x == INT_MIN) dacă utilizați abs(x) și gestionați acest caz în consecință.
- Încercați să utilizați Long în loc de INTEGER, dar amintiți-vă că LONG_MIN va da și el același rezultat, așa că aveți grijă.