logo

INT_MAX un INT_MIN programmā C/C++ un lietojumprogrammās

Lielākoties konkursa programmēšanā ir jāpiešķir mainīgais, maksimālā vai minimālā vērtība, ko var saturēt datu tips, taču atcerēties tik lielu un precīzu skaitli ir sarežģīts darbs. Tāpēc C/C++ ir noteikti makro, lai attēlotu šos skaitļus, lai tos varētu tieši piešķirt mainīgajam, faktiski neierakstot visu skaitli.

C/C++ nodrošina divus šādus makro, proti, INT_MAX un INT_MIN, kas apzīmē veselu skaitļu ierobežojumus. Atkarībā no kompilatora un C++ standarta, iespējams, būs jāiekļauj galvenes fails vai attiecīgi savā C vai C++ avota kodā. Tāpēc ir ieteicams iekļaut šo galvenes failu, lai izmantotu makro INT_MAX un INT_MIN. Lai uzzinātu vairāk par šo galvenes failu, skatiet šo rakstu .



INT_MAX valodā C/C++

INT_MAX ir makro, kas norāda, ka vesels mainīgais nevar saglabāt vērtību, kas pārsniedz šo ierobežojumu. Tas pārstāv augšējās robežas maksimālā vērtība vesela skaitļa datu tipa C/C++.

INT_MAX vērtība ir:

kas ir f5 uz tastatūras
  • INT_MAX = 2147483647 (32 bitu veseliem skaitļiem)
  • INT_MAX = 9,223,372,036,854,775,807 (64 bitu veseliem skaitļiem)

INT_MIN valodā C/C++

INT_MIN ir makro, kas norāda, ka vesels mainīgais nevar saglabāt vērtību, kas ir mazāka par šo ierobežojumu. Tas pārstāv minimālā vērtība vai zemākā robeža no vesela skaitļa datu tipa.



INT_MIN vērtība ir:

  • INT_MIN = – 2147483648 (32 bitu veseliem skaitļiem)
  • INT_MIN = – 9,223,372,036,854,775,808 (64 bitu veseliem skaitļiem)

Piezīme: Vērtības INT_MAX un INT_MIN var atšķirties atkarībā no kompilatora. Tālāk ir norādītas tipiskās vērtības kompilatorā, kurā veseli skaitļi tiek saglabāti, izmantojot 32 bitus.

INT_MIN un INT_MAX piemērs

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); }>

Izvade
2147483647 -2147483648>

INT_MAX un INT_MIN lietojumprogrammas

Tālāk ir norādītas galvenās INT_MAX un INT_MIN lietojumprogrammas



1. Pārbaudiet, vai nav Integer Overflow

Mēs varam izmantot makro INT_MIN un INT_MAX, lai pārbaudītu, vai nav parakstīts vesels skaitlis. Zemāk redzamais piemērs parāda, kā to izdarīt.

binārā meklēšanas koks]

Piemērs

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;  // Pārplūde nav notikusi citādi return num1 + num2; } // Draivera kods int main() { // Šo skaitļu summa būs vienāda ar INT_MAX // Ja kāds no tiem tiek palielināts par 1, notiks pārpilde // int num1 = 2147483627;  int num2 = 20;  // Rezultāts ir -1, ja notika pārpilde // Saglabā summu, pretējā gadījumā int rezultāts = check_overflow(num1, num2);  // Pārplūde radās, ja (rezultāts == -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;  // Pārplūde nav notikusi citādi return num1 + num2; } int main(void) { // Šo skaitļu summa būs līdzvērtīga // INT_MAX Ja kāds no tiem tiek palielināts par 1, notiks pārpilde // int num1 = 2147483627;  int num2 = 20;  // Rezultāts ir -1, ja notika pārpilde // Saglabā summu, pretējā gadījumā int rezultāts = check_overflow(num1, num2);  // Notika pārpilde if (rezultāts == -1) printf('Integer pārpilde');  // Nav pārpildes else printf('%d', rezultāts);  atgriezties 0; } // Šo kodu ir izveidojis sarajadhav12052009>

Izvade
2147483647>

Līdzīgi mēs varam pārbaudīt, vai nav pārpildes, atņemot 2 skaitļus, izmantojot INT_MIN.

2. MIN aprēķināšana masīvā ar lieliem elementiem

Mēs parasti piešķiram lielu vērtību MIN, lai aprēķinātu minimālo vērtību masīvā. Bet, ja masīvā ir lieli elementi, mums ir jāpiešķir masīvam augstākā iespējamā vērtība.

Tālāk ir norādīta ieviešana:

Piemērs

kā atspējot izstrādātāja režīmu
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); }>

Izvade
2019403813>

Tāpat MAX var atrast lielu skaitļu masīvā, izmantojot INT_MIN.

Bieži uzdotie jautājumi par INT_MIN un INT_MAX

1. Kāpēc abs(INT_MIN) nedod gaidīto rezultātu?

Vai esat kādreiz saskāries ar problēmu, kad, iespējams, esat izmantojis funkciju abs()? Visticamāk, NĒ, ja neesat atrisinājis nevienu problēmu, kurai nepieciešama absolūta funkcija. Bet, ja esat atrisinājis problēmas vietnē techcodeview.com vai Leetcode, jūs zināt, ka vienmēr ir viens testa gadījums, kad jums neizdodas, un tas ir, ja jums ir vērtība INT_MIN.

Apskatīsim, kas notiek, ja mēs izmantojam absolūto funkciju, tā atgriež mod vērtību, kas nozīmē, ka tā atgriež šādu vērtību:

Moduļu vērtības

Tagad vēl viena lieta, ko mēs zinām, ir vesela skaitļa diapazons no -2 147 483 648 līdz 2 147 483 647 vai mēs varam teikt, ka tas ir no -2 31 uz 2 31 - 1 tā kā mēs redzam, ka ir vienmēr par vienu negatīvo pusi vairāk nekā pozitīvo

Tagad redzēsim, kas notiek, mēģinot iegūt rezultāta absolūtās vērtības:

virkne aizstāj visu java
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; }>

Izvade
Value of INT_MIN is: -2147483648 Value of abs(INT_MIN) is: -2147483648>

Tagad mēs varam novērot, ka abs(INT_MIN) pats par sevi ir INT_MIN, un tas izraisa daudz kļūdu, kad mēs sniedzam tiešsaistes novērtējumus vai risinām jebkuru problēmu.

Iemesls

Tagad, ja nonākam līdz iemesla daļai, mēs redzam, ka mums pašlaik ir darīšana ar Vesela skaitļa daļu un abs(integer) atgriež pati vesela skaitļa vērtību, tāpēc pārejot blakus attēlojumam INT_MIN var attēlot kā

INT_MIN = -2147483648 = 10000000000000000000000000000000>

Šeit pirmais bits apzīmē zīmes bitu, kas ir iestatīts uz vienu, kas nozīmē, ka tas ir negatīvs skaitlis, un nākamā daļa ir 31 bita binārais attēlojums 2147483648.

Tagad, ja mēs mēģināsim ņemt absolūto vērtību INT_MIN, tas mēģinās mums dot +2147483648, un šo vērtību nevar attēlot vesela skaitļa formā, jo maksimālā vērtība, ko var attēlot, ir +2147483647, jo pozitīvajā pusē mums ir ir 231 vesels skaitlis, bet ir iekļauts arī 0, tāpēc diapazons no 1 līdz 2147483648 mainās uz 0 uz 2147483647, un šī iemesla dēļ abs(INT_MIN) nevar attēlot šajā diapazonā, un atgrieztā atbilde ir tāda pati kā INT_MIN.

Risinājums

Problēmai varētu būt daudz risinājumu, taču daži no labākajiem risinājumiem ir:

  1. Vienmēr izmantojiet īpašu malas reģistru, lai pārbaudītu if(x == INT_MIN), ja izmantojat abs(x), un attiecīgi rīkojieties šajā gadījumā.
  2. Mēģiniet izmantot Long, nevis INTEGER, taču atcerieties, ka arī LONG_MIN dos tādu pašu rezultātu, tāpēc esiet piesardzīgs.