Overflow exception - probleme de la interviu

Posted by anghelvalentin on September 19, 2019

Nu stiu daca ti-ai pus vreodata intrebarea ce se intampla daca aduni 1 la maxim de int. Adica avem asa:

int x= Int32.MaxValue;
x++;
Console.WriteLine(x); 

Stii ce o sa afiseze? O sa afiseze un numar negativ destul de lung, care este Int32.MinValue. O sa te intrebi, bine bine, dar cum ?

Pai foarte simplu, uite cum functioneaza adunarea de biti ( int32 e pe 32 de biti, dar o sa iau un exemplu mult mai mic). Pentru variabilele normale, nu cele unsigned, bitul cel mai din stanga determina daca numarul e pozitiv sau nu ( 0 inseamna pozitiv, 1 negativ). Variabilele de tip unsigned, au limita superioara mult mai mare, in timp ce limita inferioara este 0, intrucat nu mai exista bitul de semn.


Pai dupa cum vezi in exemplu de mai sus, ia gandeste-te ce se intampla cand adunam la int32.max valoarea 1, pai uite exemplul nostru:


Daca incerci sa faci adunare Int32.MaxValue+1, fara alte variabilele, compilatorul isi da seama si te atentioneaza.

Acum ca ai inteles ce se intampla cand aduni int32.MaxValue cu 1, hai sa vezi ce bug misto apare cu un loop. Mai ti minte cand in liceu, unii colegi parcurgeau un loop de la 1, cat timp I mai mic sau egal decat limita superioara. Adica ceva de genul:

for (int i = 1; i <= Int32.MaxValue; i++)
{}

Pai ia gandeste-te, se termina vreodata for-ul asta ? Iti zic eu ca nu, si se numeste bucla infinita, mai pui si procesorul la treaba.

Rezolvarea exceptiei Overflow

Cei de la Microsoft au creat keyword-ul checked, pentru a marca blocurile de cod ce fac adunari mari, pentru a arunca o exceptie in momentul in care se depaseste limita superioara. Astfel se arunca exceptia OverflowException ce trebuie tratata intr-un catch.

try
{
	checked
	{
		for (int i = 1; i <= Int32.MaxValue; i++)
		{

		}
		Console.WriteLine("Does it print?");
	}
}
catch (System.OverflowException e)
{
	Console.WriteLine("Hurrey. The exception was raised and caught");
}

Codul sursa