byte + byte =未知结果

时间:2012-07-22 14:26:49

标签: c#

美好的一天!我试图添加两个字节变量,并注意到奇怪的结果。

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

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

当我试图运行该程序时,显示

255 + 1 = 0

上面的代码怎么了?为什么编译器不会抛出OverflowException?我怎么可能抓住异常?我是一个VB人,慢慢迁移到C#:)抱歉这个问题。

2 个答案:

答案 0 :(得分:17)

默认情况下,C#代码为unchecked,因此溢出将以静默方式环绕而不是抛出异常。

您可以通过将代码包装在checked块中来获得异常,但代价是性能稍差。

答案 1 :(得分:9)

因为默认情况下,C#不检查算术运算溢出。尝试用checked包装它,这样就会抛出异常。

试试这个:

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