2012-07-22 14 views
12

Dzień dobry TAK! Próbowałem dodać dwie zmienne bajtowe i zauważyłem dziwny wynik.bajt + bajt = nieznany wynik

byte valueA = 255; 
byte valueB = 1; 
byte valueC = (byte)(valueA + valueB); 

Console.WriteLine("{0} + {1} = {2}", valueA.ToString(), 
            valueB.ToString(), 
            valueC.ToString()); 

przy próbie uruchomienia programu, wyświetla

255 + 1 = 0 

Co się stało z powyższym kodzie? Dlaczego kompilator nie rzuca OverflowException? Jak mogę złapać wyjątek? Jestem facetem VB i powoli migruję do C# :) Przepraszamy za pytanie.

+1

Cóż, Twój kod nie przeleje. Odrzuca bity podczas obsady, ale wyraźnie poprosiłeś o to. –

Odpowiedz

17

Kod C# jest domyślnie ustawiony na unchecked, więc przepełnienia będą zawijać w milczeniu, zamiast rzucać wyjątek.

Możesz otrzymać wyjątek, zawijając kod w bloku checked, kosztem nieznacznego histogramu wydajności.

9

ponieważ domyślnie C# nie sprawdza dla operacji arytmetycznych przepełnienia. spróbuj owijać go za pomocą checked, więc rzuci wyjątek.

spróbuj tego:

byte valueA = 255; 
byte valueB = 1; 
byte valueC = (byte)(valueA + valueB); 

Console.WriteLine("Without CHECKED: {0} + {1} = {2}", valueA.ToString(), 
                 valueB.ToString(), 
                 valueC.ToString()); 

try 
{ 
    valueC = checked((byte)(valueA + valueB)); 
    Console.WriteLine("With CHECKED: {0} + {1} = {2}", valueA.ToString(), 
                 valueB.ToString(), 
                 valueC.ToString()); 
} 
catch (Exception e) 
{ 
    Console.WriteLine("With CHECKED: " + e.GetType()); 
} 

checked @ MSDN

+0

dzięki za próbkę –