logo

INT_MAX in INT_MIN v C/C++ in aplikacijah

V tekmovalnem programiranju je večino časa treba spremenljivki dodeliti največjo ali najmanjšo vrednost, ki jo lahko vsebuje podatkovni tip, vendar je zapomniti tako veliko in natančno število težko delo. Zato ima C/C++ določene makre za predstavitev teh števil, tako da jih je mogoče neposredno dodeliti spremenljivki, ne da bi dejansko vnesli celotno število.

C/C++ ponuja dva takšna makra, in sicer INT_MAX in INT_MIN, ki predstavljata meje celih števil. Odvisno od prevajalnika in standarda C++ boste morda morali vključiti datoteko glave oz v izvorni kodi C ali C++. Zato je priporočljivo vključiti to datoteko glave za uporabo makrov INT_MAX in INT_MIN. Za nadaljnje branje te datoteke glave glej ta članek .



INT_MAX v C/C++

INT_MAX je makro, ki določa, da celoštevilska spremenljivka ne more shraniti nobene vrednosti nad to omejitvijo. Predstavlja največja vrednost zgornje meje podatkovnega tipa celo število v C/C++.

Vrednost INT_MAX je:

gimp izvozi kot jpg
  • INT_MAX = 2147483647 (za 32-bitna cela števila)
  • INT_MAX = 9.223.372.036.854.775.807 (za 64-bitna cela števila)

INT_MIN v C/C++

INT_MIN je makro, ki določa, da celoštevilska spremenljivka ne more shraniti nobene vrednosti pod to mejo. Predstavlja minimalna vrednost ali spodnja meja celoštevilskega podatkovnega tipa.



Vrednost INT_MIN je:

  • INT_MIN = – 2147483648 (za 32-bitna cela števila)
  • INT_MIN = – 9.223.372.036.854.775.808 (za 64-bitna cela števila)

Opomba: Vrednosti INT_MAX in INT_MIN se lahko razlikujejo od prevajalnika do prevajalnika. Sledijo tipične vrednosti v prevajalniku, kjer so cela števila shranjena z uporabo 32 bitov.

Primer INT_MIN in 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); }>

Izhod
2147483647 -2147483648>

Uporabi INT_MAX in INT_MIN

Sledijo glavne uporabe INT_MAX in INT_MIN



1. Preverite prelivanje celih števil

Uporabimo lahko makra INT_MIN in INT_MAX, da preverimo prekoračitev celega števila s predznakom. Spodnji primer prikazuje, kako to storiti.

Primer

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) vrni -1;  // Do preliva ni prišlo drugače vrni num1 + num2; } // Koda gonilnika int main() { // Vsota teh števil bo enaka INT_MAX // Če se katera od njih poveča za 1, bo prišlo do prelivanja // int num1 = 2147483627;  int num2 = 20;  // Rezultat je -1, če je prišlo do prelivanja // Shrani vsoto, sicer int rezultat = check_overflow(num1, num2);  // Do preliva je prišlo, če (rezultat == -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) vrni -1;  // Do preliva ni prišlo drugače vrni num1 + num2; } int main(void) { // Vsota teh števil bo enakovredna // INT_MAX Če se katero od njih poveča za 1, bo // prišlo do prelivanja int num1 = 2147483627;  int num2 = 20;  // Rezultat je -1, če je prišlo do prelivanja // Shrani vsoto, drugače int result = check_overflow(num1, num2);  // Prišlo je do prekoračitve, če (rezultat == -1) printf('Prišlo je do prekoračitve celega števila');  // Brez preliva else printf('%d', rezultat);  vrni 0; } // To kodo je prispeval sarajadhav12052009>

Izhod
2147483647>

Podobno lahko preverimo prelivanje med odštevanjem 2 števil z uporabo INT_MIN.

css seznami

2. Računanje MIN v nizu z velikimi elementi

Običajno dodelimo visoko vrednost MIN, da izračunamo najmanjšo vrednost v matriki. Če pa ima matrika velike elemente, ji moramo dodeliti najvišjo možno vrednost.

Spodaj je izvedba:

Primer

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

Izhod
2019403813>

Podobno lahko MAX najdete v nizu velikih števil z uporabo INT_MIN.

Pogosta vprašanja o INT_MIN in INT_MAX

1. Zakaj abs(INT_MIN) ne daje pričakovanega rezultata?

Ste se že kdaj srečali s težavo, ko ste morda uporabili funkcijo abs()? Najverjetneje NE, če niste rešili nobenega problema, ki zahteva absolutno funkcijo. Toda če ste reševali težave na techcodeview.com ali Leetcode, potem veste, da vedno obstaja en testni primer, kjer vam ne uspe, in ta testni primer je, ko imate vrednost kot INT_MIN.

Poglejmo, kaj se zgodi, če uporabimo absolutno funkcijo, ki vrne vrednost mod, kar pomeni, da vrne naslednjo vrednost:

mvc v spomladanskem okviru

Vrednosti modula

Še ena stvar, ki jo vemo, je obseg celega števila od -2.147.483.648 do 2.147.483.647 ali lahko rečemo, da je od -2 31 do 2 31 - 1 tako kot vidimo, da obstaja vedno ena bolj na negativni strani kot na pozitivni

Zdaj pa poglejmo, kaj se zgodi, ko poskušamo vzeti absolutne vrednosti rezultata:

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

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

Zdaj lahko opazimo, da je abs(INT_MIN) sam INT_MIN, kar povzroča veliko napak, ko podajamo spletne ocene ali rešujemo kakršen koli problem.

pisava gimp

Razlog

Zdaj, če pridemo do dela z razlogom, lahko vidimo, da imamo trenutno opravka z delom Integer in abs(integer) sam vrne celo vrednost, tako da je premikanje poleg predstavitve INT_MIN lahko predstavljeno kot

INT_MIN = -2147483648 = 10000000000000000000000000000000>

Tukaj 1. bit predstavlja predznakovni bit, ki je nastavljen na ena, kar pomeni, da je negativno število, naslednji del pa je 31-bitna binarna predstavitev za 2147483648.

Zdaj, če poskušamo vzeti absolutno vrednost INT_MIN, nam bo poskusil dati +2147483648 in te vrednosti ni mogoče predstaviti v obliki celega števila, saj je največja vrednost, ki jo je mogoče predstaviti, +2147483647, saj moramo na pozitivni strani predstavljajo 231 celih števil, vendar je vključena tudi 0, tako da se obseg od 1 do 2147483648 spremeni v 0 do 2147483647 in iz tega razloga abs(INT_MIN) ni mogoče predstaviti v tem obsegu in vrnjeni odgovor je enak INT_MIN.

rešitev

No, morda obstaja veliko rešitev za težavo, vendar so nekatere najboljše rešitve:

  1. Vedno uporabite poseben robni primer za preverjanje if(x == INT_MIN), če uporabljate abs(x), in ustrezno obravnavajte ta primer.
  2. Poskusite uporabiti Long namesto INTEGER, vendar ne pozabite, da bo tudi LONG_MIN dalo enak rezultat, zato bodite previdni.