12

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

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# :) 对不起这个问题。

4

2 回答 2

17

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

您可以通过将代码包装在一个块中来获得异常,checked但会以轻微的性能损失为代价。

于 2012-07-22T14:28:15.047 回答
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());
}

检查@MSDN

于 2012-07-22T14:40:02.517 回答