Overflow de numere întregi
Știți deja că atunci când se adaugă un număr întreg, poate apărea o depășire. Cunoașterea este că calculatorul nu emite avertismente atunci când se revarsă: programul va continua să lucreze cu date greșite. Mai mult, comportamentul de suprapunere este definit numai pentru numere întregi nesemnate.
Overflow-ul poate duce la probleme grave: zero și pierderi de date, posibile exploatări, erori subtile care se vor acumula în timp.
Să luăm în considerare mai multe metode de urmărire a depășirilor întregi cu un semn și a întregului număr nesemnat.
1. Verificarea preliminară a datelor. Știm, din fișierul limits.h, valoarea maximă și minimă pentru numere de tip int. Dacă ambele numere sunt pozitive, atunci suma lor nu depășește INT_MAX dacă diferența dintre INT_MAX și unul dintre numere este mai mică decât al doilea număr. Dacă ambele numere sunt negative, atunci diferența dintre INT_MIN și unul dintre numere trebuie să fie mai mare decât cealaltă. Dacă ambele numere au semne diferite, atunci suma lor nu depășește fără echivoc INT_MAX sau INT_MIN.
În această funcție, variabila de depășire va fi setată la 1 dacă a existat o depășire. Funcția returnează o sumă, indiferent de rezultatul adăugării.
2. A doua metodă de verificare este de a lua pentru o sumă un tip a cărui valoare maximă (și minimă) este cu siguranță mai mare decât suma a două numere întregi. După adăugare, este necesar să verificați dacă suma nu mai este. decât INT_MAX și nu mai puțin de INT_MIN.
Rețineți distribuția explicită a tipurilor. Fără aceasta, va apărea mai întâi o depășire și un număr greșit va fi scris la variabila c.
3. Cea de-a treia modalitate de testare este independentă de platformă, în plus, implementarea acesteia va fi diferită pentru compilarele diferite. În cazul în care întreaga (de obicei) depășește, pavilionul de suprapunere din registrul de steaguri crește. Este posibil ca limbajul de asamblare să verifice valoarea steagului imediat după efectuarea sumei.
Aici variabila noOverflow este 1 dacă nu există nici o depășire. jno (săriți dacă nu există prea mult) se deplasează la eticheta NO_OVERFLOW dacă nu a existat nicio depășire. Dacă a fost depășirea, atunci
Lucrul cu numerele nesemnate este mult mai simplu: atunci când are loc un flux de peste, acesta este resetat și se știe că numărul rezultat va fi cu siguranță mai mic decât fiecare dintre termeni.
Iată codul complet, cu verificările.
ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 [email protected] Ștefan Șpașev studenți