V konkurenčním programování je většinou potřeba přiřadit proměnnou, maximální nebo minimální hodnotu, kterou datový typ může pojmout, ale zapamatovat si tak velké a přesné číslo je obtížná práce. Proto má C/C++ určitá makra pro reprezentaci těchto čísel, takže je lze přímo přiřadit k proměnné, aniž by bylo nutné zadávat celé číslo.
C/C++ poskytuje dvě taková makra, jmenovitě INT_MAX a INT_MIN, která představují celočíselné limity. V závislosti na kompilátoru a standardu C++ budete možná muset zahrnout soubor záhlaví nebo ve zdrojovém kódu C nebo C++. Proto je vhodné zahrnout tento hlavičkový soubor pro použití maker INT_MAX a INT_MIN. Pro další čtení tohoto hlavičkového souboru viz tento článek .
INT_MAX v C/C++
INT_MAX je makro, které určuje, že celočíselná proměnná nemůže uložit žádnou hodnotu nad tento limit. Představuje maximální hodnota horní hranice datového typu integer v C/C++.
Hodnota INT_MAX je:
binární vyhledávací strom vs binární strom
- INT_MAX = 2147483647 (pro 32bitová celá čísla)
- INT_MAX = 9,223,372,036,854,775,807 (pro 64bitová celá čísla)
INT_MIN v C/C++
INT_MIN je makro, které určuje, že celočíselná proměnná nemůže uložit žádnou hodnotu pod tento limit. Představuje minimální hodnotu nebo spodní hranici datového typu integer.
Hodnota INT_MIN je:
- INT_MIN = – 2147483648 (pro 32bitová celá čísla)
- INT_MIN = – 9,223,372,036,854,775,808 (pro 64bitová celá čísla)
Poznámka: Hodnoty INT_MAX a INT_MIN se mohou lišit kompilátor od kompilátoru. Následují typické hodnoty v kompilátoru, kde jsou celá čísla uložena pomocí 32 bitů.
mapový java iterátor
Pří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ýstup
2147483647 -2147483648>
Aplikace INT_MAX a INT_MIN
Následují hlavní aplikace INT_MAX a INT_MIN
1. Zkontrolujte přetečení celého čísla
Pro kontrolu přetečení celého čísla se znaménkem můžeme použít makra INT_MIN a INT_MAX. Níže uvedený příklad ukazuje, jak na to.
Pří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 přetečení else return num1 + num2; } // Kód ovladače int main() { // Součet těchto čísel se bude rovnat INT_MAX // Pokud se některé z nich zvýší o 1, dojde k přetečení // int num1 = 2147483627; int num2 = 20; // Výsledek je -1, pokud došlo k přetečení // Uloží součet, jinak int result = check_overflow(num1, num2); // Došlo k přetečení, pokud (výsledek == -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 přetečení else return num1 + num2; } int main(void) { // Součet těchto čísel bude ekvivalentní // INT_MAX Pokud se kterékoli z nich zvýší o 1, dojde k přetečení // int num1 = 2147483627; int num2 = 20; // Výsledek je -1, pokud došlo k přetečení // Uloží součet, jinak int result = check_overflow(num1, num2); // Došlo k přetečení if (výsledek == -1) printf('Došlo k přetečení celého čísla'); // Žádné přetečení else printf('%d', výsledek); návrat 0; } // Tento kód přispěl sarajadhav12052009>
Výstup
2147483647>
Podobně můžeme zkontrolovat přetečení při odečítání 2 čísel pomocí INT_MIN.
2. Výpočet MIN v poli s velkými prvky
Obvykle přiřazujeme vysokou hodnotu MIN, abychom vypočítali minimální hodnotu v poli. Ale pokud má pole velké prvky, musíme poli přiřadit nejvyšší možnou hodnotu.
Níže je implementace:
Příklad
zpětné volání peklo v javascriptuC++
// 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ýstup
2019403813>
Podobně lze MAX nalézt v poli velkých čísel pomocí INT_MIN.
Časté dotazy na INT_MIN a INT_MAX
1. Proč abs(INT_MIN) nedává očekávaný výsledek?
Setkali jste se někdy s problémem, kdy jste mohli použít funkci abs()? S největší pravděpodobností NE, pokud jste nevyřešili žádný problém, který vyžaduje absolutní funkci. Ale pokud jste vyřešili problémy na techcodeview.com nebo Leetcode, pak víte, že vždy existuje jeden testovací případ, kdy selžete, a tento testovací případ je, když máte hodnotu INT_MIN.
Podívejme se, co se stane, když použijeme absolutní funkci, vrátí hodnotu mod, což znamená, že vrátí následující hodnotu:

Hodnoty modulu
Další věc, kterou víme, je rozsah celého čísla od -2 147 483 648 do 2 147 483 647 nebo můžeme říci, že je od -2 31 do 2 31 - 1 takže jak vidíme, existuje vždy o jeden více na negativní straně než na pozitivní
Nyní se podívejme, co se stane, když se pokusíme vzít absolutní 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ýstup
Value of INT_MIN is: -2147483648 Value of abs(INT_MIN) is: -2147483648>
Nyní můžeme pozorovat, že abs(INT_MIN) je samo o sobě INT_MIN a to způsobuje mnoho chyb, když poskytujeme jakékoli online hodnocení nebo řešíme jakýkoli problém.
Důvod
Nyní, když se dostaneme k části důvodu, můžeme vidět, že se aktuálně zabýváme částí Integer a abs(integer) vrací samotnou celočíselnou hodnotu, takže pohyb vedle reprezentace INT_MIN může být reprezentován jako
zdarma vs zdarma
INT_MIN = -2147483648 = 10000000000000000000000000000000>
Zde 1. bit představuje bit znaménka, který je nastaven na jedničku, což znamená, že jde o záporné číslo, a další část je 31bitová binární reprezentace pro 2147483648.
Nyní, když se pokusíme vzít absolutní hodnotu INT_MIN, pokusí se nám dát +2147483648 a tato hodnota nemůže být reprezentována ve formě Integer, protože maximální hodnota, kterou lze reprezentovat, je +2147483647, protože na kladné straně musíme reprezentují 231 celých čísel, ale je zahrnuta i 0, takže rozsah od 1 do 2147483648 se změní na 0 až 2147483647 a z tohoto důvodu nemůže být abs(INT_MIN) v tomto rozsahu reprezentováno a vrácená odpověď je stejná jako INT_MIN.
Řešení
Možná existuje mnoho řešení problému, ale některá z nejlepších řešení jsou:
- Vždy používejte speciální okrajový případ pro kontrolu if(x == INT_MIN), pokud používáte abs(x) a podle toho s tímto případem zacházejte.
- Zkuste použít Long místo INTEGER, ale nezapomeňte, že LONG_MIN také poskytne stejný výsledek, takže buďte opatrní.