logo

INT_MAX i INT_MIN w C/C++ i aplikacjach

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:

  1. Zawsze używaj specjalnego przypadku Edge do sprawdzania if(x == INT_MIN), jeśli używasz abs(x) i odpowiednio obsługuj ten przypadek.
  2. 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.