W większości przypadków w programowaniu konkurencyjnym istnieje potrzeba przypisania zmiennej, maksymalnej lub minimalnej wartości, jaką może pomieścić typ danych, ale zapamiętanie tak dużej i dokładnej liczby okazuje się trudnym zadaniem. Dlatego w języku C/C++ istnieją pewne makra reprezentujące te liczby, dzięki czemu można je bezpośrednio przypisać do zmiennej bez konieczności wpisywania całej liczby.
C/C++ udostępnia dwa takie makra, mianowicie INT_MAX i INT_MIN, które reprezentują limity liczb całkowitych. W zależności od kompilatora i standardu C++ może być konieczne dołączenie pliku nagłówkowego Lub odpowiednio w kodzie źródłowym C lub C++. Dlatego zaleca się dołączenie tego pliku nagłówkowego w celu użycia makr INT_MAX i INT_MIN. Aby uzyskać dalsze informacje na temat tego pliku nagłówkowego, zapoznaj się z tym artykułem .
INT_MAX w C/C++
INT_MAX to makro określające, że zmienna całkowita nie może przechowywać żadnej wartości przekraczającej ten limit. Reprezentuje maksymalna wartość górnego limitu typu danych integer w C/C++.
Wartość INT_MAX wynosi:
jsp javatpoint
- INT_MAX = 2147483647 (dla 32-bitowych liczb całkowitych)
- INT_MAX = 9 223 372 036 854 775 807 (dla 64-bitowych liczb całkowitych)
INT_MIN w C/C++
INT_MIN to makro określające, że zmienna całkowita nie może przechowywać żadnej wartości poniżej tego limitu. Reprezentuje wartość minimalna lub dolna granica typu danych całkowitych.
Wartość INT_MIN to:
- INT_MIN = – 2147483648 (dla 32-bitowych liczb całkowitych)
- INT_MIN = – 9 223 372 036 854 775 808 (dla 64-bitowych liczb całkowitych)
Notatka: Wartości INT_MAX i INT_MIN mogą się różnić w zależności od kompilatora. Poniżej znajdują się typowe wartości w kompilatorze, w którym liczby całkowite są przechowywane przy użyciu 32 bitów.
Przykład 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); }> Wyjście
2147483647 -2147483648>
Zastosowanie INT_MAX i INT_MIN
Poniżej przedstawiono główne zastosowania INT_MAX i INT_MIN
1. Sprawdź, czy nie ma przepełnienia liczb całkowitych
Możemy użyć makr INT_MIN i INT_MAX, aby sprawdzić przepełnienie liczby całkowitej ze znakiem. Poniższy przykład pokazuje, jak to zrobić.
Przykład
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 - liczba2) zwróć -1; // Nie wystąpiło żadne przepełnienie, w przeciwnym razie return num1 + num2; } // Kod sterownika int main() { // Suma tych liczb będzie równa INT_MAX // Jeśli którakolwiek z nich zostanie zwiększona o 1, nastąpi przepełnienie // int num1 = 2147483627; int liczba2 = 20; // Wynik to -1, jeśli wystąpiło przepełnienie // Przechowuje sumę, w przeciwnym razie int wynik = check_overflow(num1, num2); // Nastąpiło przepełnienie if (result == -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 - liczba2) zwróć -1; // Nie wystąpiło żadne przepełnienie, w przeciwnym razie return num1 + num2; } int main(void) { // Suma tych liczb będzie równa // INT_MAX Jeśli któraś z nich zostanie zwiększona o 1, nastąpi przepełnienie // int num1 = 2147483627; int liczba2 = 20; // Wynik to -1, jeśli wystąpiło przepełnienie // Przechowuje sumę, w przeciwnym razie int wynik = check_overflow(num1, num2); // Wystąpiło przepełnienie if (result == -1) printf('Wystąpiło przepełnienie liczby całkowitej'); // Brak przepełnienia w przeciwnym razie printf('%d', wynik); zwróć 0; } // Ten kod został napisany przez sarajadhav12052009> Wyjście
2147483647>
Podobnie możemy sprawdzić przepełnienie podczas odejmowania 2 liczb za pomocą INT_MIN.
Strumień filtra Java
2. Obliczanie MIN w tablicy z dużymi elementami
Zwykle przypisujemy dużą wartość do MIN, aby obliczyć minimalną wartość w tablicy. Jeśli jednak tablica zawiera duże elementy, musimy przypisać jej najwyższą możliwą wartość.
Poniżej implementacja:
Przykład
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); }> Wyjście
2019403813>
Podobnie MAX można znaleźć w tablicy dużych liczb, używając INT_MIN.
Często zadawane pytania dotyczące INT_MIN i INT_MAX
1. Dlaczego abs(INT_MIN) nie daje oczekiwanego wyniku?
Czy kiedykolwiek spotkałeś się z problemem, gdy mogłeś użyć funkcji abs()? Najprawdopodobniej NIE, jeśli nie rozwiązałeś żadnego problemu wymagającego funkcji bezwzględnej. Ale jeśli rozwiązałeś problemy na techcodeview.com lub Leetcode, wiesz, że zawsze istnieje jeden przypadek testowy, w którym zakończy się niepowodzeniem, a ten przypadek testowy ma miejsce, gdy masz wartość INT_MIN.
Zobaczmy, co się stanie, jeśli użyjemy funkcji bezwzględnej, która zwróci wartość mod, co oznacza, że zwróci następującą wartość:
szereg Fibonacciego w ok

Wartości modułu
Kolejną rzeczą, którą wiemy, jest to, że zakres liczb całkowitych wynosi od -2 147 483 648 do 2 147 483 647 lub możemy powiedzieć, że pochodzi z -2 31 do 2 31 - 1 więc jak widzimy, że istnieje zawsze o jeden więcej po stronie ujemnej niż dodatniej
Zobaczmy teraz, co się stanie, gdy spróbujemy przyjąć wartości bezwzględne wyniku:
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; }> Wyjście
Value of INT_MIN is: -2147483648 Value of abs(INT_MIN) is: -2147483648>
Teraz możemy zaobserwować, że abs(INT_MIN) to samo INT_MIN, co powoduje wiele błędów, gdy wystawiamy jakąkolwiek ocenę online lub rozwiązujemy jakikolwiek problem.
sąsiednie kąty
Powód
Teraz, jeśli dotrzemy do części powodu, zobaczymy, że aktualnie mamy do czynienia z częścią całkowitą, a abs(integer) sama zwraca wartość całkowitą, więc przejście obok reprezentacji INT_MIN można przedstawić jako
INT_MIN = -2147483648 = 10000000000000000000000000000000>
Tutaj pierwszy bit reprezentuje bit znaku, który jest ustawiony na jeden, co oznacza, że jest to liczba ujemna, a następna część to 31-bitowa reprezentacja binarna dla 2147483648.
Teraz, jeśli spróbujemy przyjąć wartość bezwzględną INT_MIN, spróbuje dać nam +2147483648, a tej wartości nie można przedstawić w postaci całkowitej, ponieważ maksymalna wartość, jaką można przedstawić, to +2147483647, ponieważ musimy to zrobić po stronie dodatniej reprezentują 231 liczb całkowitych, ale 0 jest również uwzględnione, więc zakres od 1 do 2147483648 zmienia się od 0 do 2147483647 i z tego powodu abs(INT_MIN) nie może być reprezentowany w tym zakresie i zwrócona odpowiedź jest taka sama jak INT_MIN.
Rozwiązanie
Cóż, rozwiązań tego problemu może być wiele, ale niektóre z najlepszych to:
- Zawsze używaj specjalnego przypadku Edge do sprawdzania if(x == INT_MIN), jeśli używasz abs(x) i odpowiednio obsługuj ten przypadek.
- Spróbuj użyć Long zamiast INTEGER, ale pamiętaj, że LONG_MIN również da ten sam wynik, więc bądź ostrożny.