2012-07-22 9 views
12

¡Buen día SO! Estaba tratando de agregar dos variables de bytes y noté resultados extraños.byte + byte = resultado desconocido

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

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

cuando traté de ejecutar el programa, se muestra

255 + 1 = 0 

¿Qué pasó con el código anterior? ¿Por qué el compilador no lanza un OverflowException? ¿Cómo puedo atrapar la excepción? Soy un chico de VB y estoy migrando lentamente a C# :) Perdón por la pregunta.

+1

Bueno, su código no se desborde. Descarta bits durante el lanzamiento, pero explícitamente le pediste que hiciera eso. –

Respuesta

17

El código de C# es unchecked de forma predeterminada, por lo que los desbordamientos se envolverán silenciosamente en lugar de arrojar una excepción.

Puede obtener una excepción envolviendo su código en un bloque checked, a costa de un ligero rendimiento histórico.

9

porque de manera predeterminada, C# no comprueba los desbordamientos de operaciones aritméticas. intente envolverlo con checked para que arroje una excepción.

probar esto:

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

gracias por la muestra –