logo

INT_MAX ir INT_MIN C/C++ ir programose

Dažniausiai konkurencinio programavimo metu reikia priskirti kintamąjį, didžiausią arba mažiausią reikšmę, kurią gali turėti duomenų tipas, tačiau prisiminti tokį didelį ir tikslų skaičių yra sunkus darbas. Todėl C/C++ turi tam tikras makrokomandas šiems skaičiams pavaizduoti, kad jas būtų galima tiesiogiai priskirti kintamajam, iš tikrųjų neįvedant viso skaičiaus.

C/C++ pateikia dvi tokias makrokomandas, būtent INT_MAX ir INT_MIN, kurios nurodo sveikųjų skaičių ribas. Priklausomai nuo kompiliatoriaus ir C++ standarto, gali reikėti įtraukti antraštės failą arba atitinkamai C arba C++ šaltinio kode. Taigi, norint naudoti makrokomandas INT_MAX ir INT_MIN, patartina įtraukti šį antraštės failą. Jei norite daugiau skaityti apie šį antraštės failą, žr. šį straipsnį .



INT_MAX C/C++

INT_MAX yra makrokomanda, nurodanti, kad sveikasis kintamasis negali saugoti jokios reikšmės, viršijančios šią ribą. Jis atstovauja maksimali viršutinės ribos vertė sveikojo skaičiaus duomenų tipo C/C++.

INT_MAX reikšmė yra:

mvc java
  • INT_MAX = 2147483647 (32 bitų sveikiesiems skaičiams)
  • INT_MAX = 9,223,372,036,854,775,807 (64 bitų sveikiesiems skaičiams)

INT_MIN C/C++

INT_MIN yra makrokomanda, nurodanti, kad sveikasis kintamasis negali saugoti jokios reikšmės, mažesnės už šią ribą. Jis atstovauja minimalią vertę arba apatinę ribą sveikojo skaičiaus duomenų tipo.



INT_MIN reikšmė yra:

  • INT_MIN = – 2147483648 (32 bitų sveikiesiems skaičiams)
  • INT_MIN = – 9,223,372,036,854,775,808 (64 bitų sveikiesiems skaičiams)

Pastaba: INT_MAX ir INT_MIN reikšmės gali skirtis priklausomai nuo kompiliatoriaus. Toliau pateikiamos tipinės vertės kompiliatoriuje, kuriame sveikieji skaičiai saugomi naudojant 32 bitus.

užblokuoti numeriai

INT_MIN ir INT_MAX pavyzdys

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

Išvestis
2147483647 -2147483648>

INT_MAX ir INT_MIN programos

Toliau pateikiamos pagrindinės INT_MAX ir INT_MIN programos



1. Patikrinkite, ar nėra sveikųjų skaičių perpildymo

Galime naudoti makrokomandas INT_MIN ir INT_MAX, kad patikrintume, ar nėra pasirašyto sveikojo skaičiaus perpildymo. Toliau pateiktame pavyzdyje parodyta, kaip tai padaryti.

Pavyzdys

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 - skaičius2) grįžti -1;  // Perpildymo neįvyko kitaip return num1 + num2; } // Tvarkyklės kodas int main() { // Šių skaičių suma bus lygi INT_MAX // Jei kuris nors iš jų padidinamas 1, perpildymas // įvyks int num1 = 2147483627;  int num2 = 20;  // Rezultatas yra -1, jei įvyko perpildymas // Išsaugoma suma, kitu atveju int rezultatas = check_overflow(num1, num2);  // Perpildymas įvyko, jei (rezultatas == -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 - skaičius2) grįžti -1;  // Perpildymo neįvyko kitaip return num1 + num2; } int main(void) { // Šių skaičių suma bus lygi // INT_MAX Jei kuris nors iš jų padidinamas 1, perpildymas // įvyks int num1 = 2147483627;  int num2 = 20;  // Rezultatas yra -1, jei įvyko perpildymas // Išsaugoma suma, kitu atveju int rezultatas = check_overflow(num1, num2);  // Perpildymas įvyko if (rezultatas == -1) printf('Įvyko sveikojo skaičiaus perpildymas');  // Nėra perpildymo kitaip printf('%d', rezultatas);  grąžinti 0; } // Šį kodą sukūrė sarajadhav12052009>

Išvestis
2147483647>

Panašiai galime patikrinti, ar nėra perpildymo, atimdami 2 skaičius naudodami INT_MIN.

2. MIN skaičiavimas masyve su dideliais elementais

Paprastai MIN priskiriame didelę reikšmę, kad apskaičiuotume mažiausią masyvo reikšmę. Bet jei masyvas turi didelių elementų, masyvui turime priskirti didžiausią įmanomą reikšmę.

Žemiau pateikiamas įgyvendinimas:

Pavyzdys

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

Išvestis
2019403813>

Panašiai MAX galima rasti didelių skaičių masyve naudojant INT_MIN.

DUK INT_MIN ir INT_MAX

1. Kodėl abs(INT_MIN) neduoda laukiamo rezultato?

Ar kada nors susidūrėte su problema, kai galbūt naudojote abs() funkciją? Labiausiai Tikriausiai NE, jei neišsprendėte jokios problemos, kuriai reikalinga absoliuti funkcija. Bet jei išsprendėte techcodeview.com arba Leetcode problemas, žinote, kad visada yra vienas bandomasis atvejis, kai nepavyksta, ir tas bandomasis atvejis, kai jūsų reikšmė yra INT_MIN.

Pažiūrėkime, kas atsitiks, jei naudosime absoliučią funkciją, ji grąžina mod reikšmę, o tai reiškia, kad grąžina šią reikšmę:

objektų klasė java

Modulio vertės

Kitas dalykas, kurį žinome, yra sveikojo skaičiaus diapazonas nuo -2 147 483 648 iki 2 147 483 647 arba galime sakyti, kad jis yra nuo -2 31 iki 2 31 – 1 taigi, kaip matome, yra visada viena daugiau iš neigiamos pusės nei teigiama

java matematikos pow

Dabar pažiūrėkime, kas nutinka, kai bandome paimti absoliučias rezultato vertes:

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

Išvestis
Value of INT_MIN is: -2147483648 Value of abs(INT_MIN) is: -2147483648>

Dabar galime pastebėti, kad abs(INT_MIN) yra pats INT_MIN, ir tai sukelia daug klaidų, kai atliekame internetinius vertinimus arba sprendžiame bet kokią problemą.

Priežastis

Jei pereisime prie priežasties dalies, pamatysime, kad šiuo metu dirbame su sveikojo skaičiaus dalimi, o abs(integer) grąžina pačią sveikojo skaičiaus reikšmę, todėl pereinant prie vaizdavimo INT_MIN galima pavaizduoti kaip

INT_MIN = -2147483648 = 10000000000000000000000000000000>

Čia 1-asis bitas reiškia ženklo bitą, kuris nustatytas į vieną, o tai reiškia, kad tai yra neigiamas skaičius, o kita dalis yra 31 bito dvejetainis 2147483648 vaizdas.

Dabar, jei bandysime paimti absoliučią INT_MIN reikšmę, ji bandys mums pateikti +2147483648 ir ši vertė negali būti pavaizduota sveikojo skaičiaus forma, nes maksimali reikšmė, kurią galima pavaizduoti, yra +2147483647, nes teigiamoje pusėje turime reiškia 231 sveikąjį skaičių, bet įtrauktas ir 0, todėl diapazonas nuo 1 iki 2147483648 pasikeičia į 0 į 2147483647 ir dėl šios priežasties abs(INT_MIN) negali būti pateiktas šiame diapazone, o atsakymas yra toks pat kaip INT_MIN.

Sprendimas

Na, gali būti daug problemos sprendimų, tačiau kai kurie iš geriausių sprendimų yra šie:

  1. Jei naudojate abs(x), patikrinkite if(x == INT_MIN), visada naudokite specialų kraštinių raidžių raštą ir atitinkamai tvarkykite šį atvejį.
  2. Pabandykite naudoti Long, o ne INTEGER, bet atminkite, kad LONG_MIN taip pat duos tą patį rezultatą, todėl būkite atsargūs.