logo

INT_MAX ja INT_MIN C/C++:ssa ja sovelluksissa

Suurimman osan ajasta kilpailevassa ohjelmoinnissa on tarve määrittää muuttuja, suurin tai pienin arvo, jonka tietotyyppi voi sisältää, mutta niin suuren ja tarkan luvun muistaminen on vaikeaa työtä. Siksi C/C++:ssa on tiettyjä makroja edustamaan näitä lukuja, jotta ne voidaan liittää suoraan muuttujaan kirjoittamatta itse kokonaislukua.

C/C++ tarjoaa kaksi tällaista makroa, nimittäin INT_MAX ja INT_MIN, jotka edustavat kokonaislukurajoja. Kääntäjästä ja C++-standardista riippuen saatat joutua sisällyttämään otsikkotiedoston tai C- tai C++-lähdekoodissasi. Siksi on suositeltavaa sisällyttää tämä otsikkotiedosto INT_MAX- ja INT_MIN-makrojen käyttöä varten. Jos haluat lukea lisää tästä otsikkotiedostosta, katso tämä artikkeli .



INT_MAX C/C++:ssa

INT_MAX on makro, joka määrittää, että kokonaislukumuuttuja ei voi tallentaa tämän rajan ylittävää arvoa. Se edustaa ylärajan enimmäisarvo kokonaislukutietotyypistä C/C++:ssa.

INT_MAX:n arvo on:

resurssien allokaatiokaavio
  • INT_MAX = 2147483647 (32-bittisille kokonaisluvuille)
  • INT_MAX = 9,223,372,036,854,775,807 (64-bittisille kokonaisluvuille)

INT_MIN C/C++:ssa

INT_MIN on makro, joka määrittää, että kokonaislukumuuttuja ei voi tallentaa tämän rajan alapuolella olevia arvoja. Se edustaa minimiarvo tai alaraja kokonaislukutietotyypistä.



INT_MIN:n arvo on:

  • INT_MIN = – 2147483648 (32-bittisille kokonaisluvuille)
  • INT_MIN = – 9,223,372,036,854,775,808 (64-bittisille kokonaisluvuille)

Huomautus: Arvot INT_MAX ja INT_MIN voivat vaihdella kääntäjäkohtaisesti. Seuraavat ovat tyypillisiä arvoja kääntäjässä, jossa kokonaisluvut tallennetaan käyttäen 32 bittiä.

Esimerkki INT_MIN ja 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); }>

Lähtö
2147483647 -2147483648>

INT_MAX ja INT_MIN sovellukset

Seuraavat ovat tärkeimmät INT_MAX- ja INT_MIN-sovellukset



1. Tarkista kokonaislukujen ylivuoto

Voimme käyttää INT_MIN- ja INT_MAX-makroja tarkistaaksemme etumerkityn kokonaisluvun ylivuodon. Alla oleva esimerkki osoittaa, kuinka se tehdään.

Esimerkki

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 - numero2) paluu -1;  // Ylivuotoa ei tapahtunut muuten paluu numero1 + num2; } // Ohjainkoodi int main() { // Näiden lukujen summa on yhtä suuri kuin INT_MAX // Jos jotakin niistä kasvatetaan yhdellä, ylivuoto // tapahtuu int num1 = 2147483627;  int num2 = 20;  // Tulos on -1, jos ylivuoto tapahtui // Tallentaa summan, muuten int tulos = check_overflow(num1, num2);  // Ylivuoto tapahtui, jos (tulos == -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 - numero2) paluu -1;  // Ylivuotoa ei tapahtunut muuten paluu numero1 + num2; } int main(void) { // Näiden lukujen summa vastaa // INT_MAX Jos jotakin niistä kasvatetaan yhdellä, ylivuoto // tapahtuu int num1 = 2147483627;  int num2 = 20;  // Tulos on -1, jos ylivuoto tapahtui // Tallentaa summan, muuten int tulos = check_overflow(num1, num2);  // Ylivuoto tapahtui if (tulos == -1) printf('Kokonaisluvun ylivuoto');  // Ei ylivuotoa else printf('%d', tulos);  paluu 0; } // Tämän koodin tarjoaa sarajadhav12052009>

Lähtö
2147483647>

Vastaavasti voimme tarkistaa ylivuodon vähentämällä 2 numeroa käyttämällä INT_MIN.

java opetusohjelma aloittelijoille

2. MIN-arvon laskeminen taulukossa, jossa on suuria elementtejä

Määritämme yleensä korkean arvon MIN-arvolle laskeaksemme taulukon vähimmäisarvon. Mutta jos taulukossa on suuria elementtejä, meidän on annettava taulukolle suurin mahdollinen arvo.

Alla toteutus:

Esimerkki

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

Lähtö
2019403813>

Vastaavasti MAX löytyy suurten numeroiden joukosta käyttämällä INT_MIN.

UKK: INT_MIN ja INT_MAX

1. Miksi abs(INT_MIN) ei anna odotettua tulosta?

Oletko koskaan kohdannut ongelmia, kun olet saattanut käyttää abs()-toimintoa? Todennäköisesti EI, jos et ole ratkaissut mitään ongelmaa, joka vaatii absoluuttisen funktion. Mutta jos olet ratkaissut ongelmia techcodeview.comssa tai Leetcodessa, tiedät, että aina on yksi testitapaus, jossa epäonnistut, ja tämä testitapaus on, kun sinulla on arvo INT_MIN.

Katsotaanpa, mitä tapahtuu, jos käytämme absoluuttista funktiota, se palauttaa mod-arvon, mikä tarkoittaa, että se palauttaa seuraavan arvon:

np.concatenate

Modulusarvot

Toinen asia, jonka tiedämme, on, että kokonaisluvun alue on -2 147 483 648 - 2 147 483 647 tai voimme sanoa, että se on -2 31 kohtaan 2 31 - 1 niin kuin voimme nähdä, että on olemassa aina yksi enemmän negatiivisella puolella kuin positiivisella

Katsotaan nyt, mitä tapahtuu, kun yritämme ottaa tuloksen absoluuttiset arvot:

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

Lähtö
Value of INT_MIN is: -2147483648 Value of abs(INT_MIN) is: -2147483648>

Nyt voimme havaita, että abs(INT_MIN) on itse INT_MIN, ja tämä aiheuttaa monia virheitä, kun annamme online-arviointeja tai ratkaisemme minkä tahansa ongelman.

rohit shetty näyttelijä

Syy

Jos nyt päästään syy-osaan, voimme nähdä, että käsittelemme tällä hetkellä kokonaislukuosaa ja abs(integer) palauttaa itse kokonaisluvun arvon, joten siirrytään esityksen viereen INT_MIN voidaan esittää muodossa

INT_MIN = -2147483648 = 10000000000000000000000000000000>

Tässä 1. bitti edustaa etumerkkibittiä, joka on asetettu yhdeksi, mikä tarkoittaa, että se on negatiivinen luku, ja seuraava osa on 31-bittinen binääriesitys numerolle 2147483648.

Jos nyt yritämme ottaa INT_MIN:n itseisarvon, se yrittää antaa meille +2147483648, eikä tätä arvoa voida esittää kokonaislukumuodossa, koska suurin esitettävä arvo on +2147483647, koska positiivisella puolella meidän on edustavat 231 kokonaislukua, mutta myös 0 sisältyy, joten alue 1 - 2147483648 muuttuu 0:ksi arvoksi 2147483647 ja tästä syystä abs(INT_MIN) ei voi olla tällä alueella ja palautettu vastaus on sama kuin INT_MIN.

Ratkaisu

No, ongelmaan voi olla monia ratkaisuja, mutta joitain parhaista ratkaisuista ovat:

  1. Käytä aina erityistä reunakirjainta tarkistaaksesi if(x == INT_MIN), jos käytät abs(x):tä ja käsittele tätä tapausta vastaavasti.
  2. Yritä käyttää Pitkää INTEGER sijaan, mutta muista, että LONG_MIN antaa myös saman tuloksen, joten ole varovainen.