V konkurenčnom programovaní je väčšinou potrebné priradiť premennú, maximálnu alebo minimálnu hodnotu, ktorú môže dátový typ obsahovať, ale zapamätať si také veľké a presné číslo je náročná práca. Preto má C/C++ určité makrá na reprezentáciu týchto čísel, takže ich možno priamo priradiť k premennej bez toho, aby ste museli zadávať celé číslo.
C/C++ poskytuje dve takéto makrá, konkrétne INT_MAX a INT_MIN, ktoré predstavujú celočíselné limity. V závislosti od kompilátora a štandardu C++ možno budete musieť zahrnúť súbor hlavičky alebo vo vašom zdrojovom kóde C alebo C++. Preto je vhodné zahrnúť tento hlavičkový súbor na použitie makier INT_MAX a INT_MIN. Pre ďalšie čítanie o tomto hlavičkovom súbore pozrite si tento článok .
INT_MAX v C/C++
INT_MAX je makro, ktoré určuje, že celočíselná premenná nemôže uložiť žiadnu hodnotu nad tento limit. Predstavuje maximálna hodnota hornej hranice dátového typu integer v C/C++.
Hodnota INT_MAX je:
koľko váži kat timpf
- INT_MAX = 2147483647 (pre 32-bitové celé čísla)
- INT_MAX = 9,223,372,036,854,775,807 (pre 64-bitové celé čísla)
INT_MIN v C/C++
INT_MIN je makro, ktoré určuje, že celočíselná premenná nemôže uložiť žiadnu hodnotu pod tento limit. Predstavuje minimálna hodnota alebo dolná hranica dátového typu celé číslo.
Hodnota INT_MIN je:
- INT_MIN = – 2147483648 (pre 32-bitové celé čísla)
- INT_MIN = – 9,223,372,036,854,775,808 (pre 64-bitové celé čísla)
Poznámka: Hodnoty INT_MAX a INT_MIN sa môžu líšiť od kompilátora k kompilátoru. Nasledujú typické hodnoty v kompilátore, kde sú celé čísla uložené pomocou 32 bitov.
Príklad INT_MIN a 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); }>
Výkon
2147483647 -2147483648>
Aplikácie INT_MAX a INT_MIN
Nasledujú hlavné aplikácie INT_MAX a INT_MIN
1. Skontrolujte pretečenie celého čísla
Na kontrolu pretečenia celého čísla so znamienkom môžeme použiť makrá INT_MIN a INT_MAX. Nižšie uvedený príklad ukazuje, ako to urobiť.
Sree Ramanujan
Príklad
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) return -1; // Nedošlo k pretečeniu else return num1 + num2; } // Kód ovládača int main() { // Súčet týchto čísel sa bude rovnať INT_MAX // Ak sa ktorékoľvek z nich zvýši o 1, dôjde k pretečeniu // int num1 = 2147483627; int num2 = 20; // Výsledok je -1, ak došlo k pretečeniu // Uloží súčet, inak int vysledok = check_overflow(num1, num2); // Pretečenie nastalo, ak (výsledok == -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) return -1; // Nedošlo k pretečeniu else return num1 + num2; } int main(void) { // Súčet týchto čísel bude ekvivalentný // INT_MAX Ak sa ktorékoľvek z nich zvýši o 1, dôjde k pretečeniu // int num1 = 2147483627; int num2 = 20; // Výsledok je -1, ak došlo k pretečeniu // Uloží súčet, inak int vysledok = check_overflow(num1, num2); // Pretečenie nastalo, ak (výsledok == -1) printf('Došlo k pretečeniu celého čísla'); // Žiadne pretečenie else printf('%d', výsledok); návrat 0; } // Tento kód prispel sarajadhav12052009>
Výkon
2147483647>
Podobne môžeme skontrolovať pretečenie pri odčítaní 2 čísel pomocou INT_MIN.
2. Výpočet MIN v poli s veľkými prvkami
Zvyčajne priraďujeme vysokú hodnotu MIN, aby sme vypočítali minimálnu hodnotu v poli. Ale ak má pole veľké prvky, musíme poli priradiť najvyššiu možnú hodnotu.
Nižšie je uvedená implementácia:
Príklad
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); }>
Výkon
2019403813>
Podobne MAX možno nájsť v poli veľkých čísel pomocou INT_MIN.
Časté otázky o INT_MIN a INT_MAX
1. Prečo abs(INT_MIN) nedáva očakávaný výsledok?
Stretli ste sa niekedy s problémom, keď ste mohli použiť funkciu abs()? Pravdepodobne NIE, ak ste nevyriešili žiadny problém, ktorý vyžaduje absolútnu funkciu. Ale ak ste vyriešili problémy na techcodeview.com alebo Leetcode, potom viete, že vždy existuje jeden testovací prípad, v ktorom zlyháte, a tento testovací prípad je, keď máte hodnotu INT_MIN.
Pozrime sa, čo sa stane, ak použijeme absolútnu funkciu, vráti hodnotu mod, čo znamená, že vráti nasledujúcu hodnotu:
koliesko myši sa neposúva správne

Hodnoty modulov
Ďalšia vec, ktorú vieme, je rozsah celého čísla od -2 147 483 648 do 2 147 483 647 alebo môžeme povedať, že je od -2 31 do 2 31 - 1 takže ako môžeme vidieť, že existuje vždy o jeden viac na negatívnej strane ako na pozitívnom
Teraz sa pozrime, čo sa stane, keď sa pokúsime získať absolútne hodnoty výsledku:
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; }>
Výkon
Value of INT_MIN is: -2147483648 Value of abs(INT_MIN) is: -2147483648>
Teraz môžeme pozorovať, že abs(INT_MIN) je samo o sebe INT_MIN a to spôsobuje veľa chýb, keď poskytujeme akékoľvek online hodnotenia alebo riešime akýkoľvek problém.
Dôvod
Ak sa teraz dostaneme k časti dôvodu, môžeme vidieť, že sa momentálne zaoberáme časťou Integer a abs(integer) vracia samotnú celočíselnou hodnotu, takže pohyb vedľa reprezentácie INT_MIN môže byť reprezentovaný ako
INT_MIN = -2147483648 = 10000000000000000000000000000000>
Tu prvý bit predstavuje bit znamienka, ktorý je nastavený na jednu, čo znamená, že ide o záporné číslo a ďalšia časť je 31-bitová binárna reprezentácia pre 2147483648.
dlhý na reťazec java
Ak sa teraz pokúsime zobrať absolútnu hodnotu INT_MIN, pokúsi sa nám dať +2147483648 a táto hodnota nemôže byť reprezentovaná v celočíselnom tvare, pretože maximálna hodnota, ktorá môže byť reprezentovaná, je +2147483647, pretože na pozitívnej strane musíme reprezentujú 231 celých čísel, ale je zahrnutá aj 0, takže rozsah od 1 do 2147483648 sa zmení na 0 až 2147483647 a z tohto dôvodu nemôže byť abs(INT_MIN) v tomto rozsahu reprezentované a vrátená odpoveď je rovnaká ako INT_MIN.
Riešenie
Môže existovať veľa riešení problému, ale niektoré z najlepších riešení sú:
- Vždy používajte špeciálny okrajový prípad na kontrolu if(x == INT_MIN), ak používate abs(x) a podľa toho narábajte s týmto prípadom.
- Skúste použiť Long namiesto INTEGER, ale pamätajte, že LONG_MIN tiež poskytne rovnaký výsledok, takže buďte opatrní.