这不应该导致溢出吗?它没有!

时间:2010-05-29 09:13:41

标签: c# windows-phone-7

无论如何,这是怎么回事?我做了一个简单的乘法:

Int64 x = 11111111111;
Int64 y = 11111111111;
Int64 z = x * y;

在乘法结束时,z显示的值为:

-5670418394979206991

这显然已经溢出,但没有例外。我想要一个人成长,但是......

请注意,这是在Windows Phone 7上,但我认为这与此问题无关。或者是吗?

4 个答案:

答案 0 :(得分:43)

您可以使用其他答案已经指出的已检查块:

checked
{
    long x = 11111111111;
    long y = 11111111111;
    long z = checked(x * y);
    // ...
}

导致异常:

  

OverflowException:算术运算导致溢出。

如果您只是在需要检查的单一操作中,可以使用checked expression代替:

long x = 11111111111;
long y = 11111111111;
long z = checked(x * y);

您还可以将/checked compiler option设置为选中默认值。

  

在Visual Studio开发环境中设置此编译器选项:

     
      
  1. 打开项目的属性页对话框。有关详细信息,请参阅Setting Visual C# Project Properties
  2.   
  3. 单击配置属性文件夹。
  4.   
  5. 点击构建属性页。
  6.   
  7. 修改检查算术溢出/下溢属性
  8.   

如果将默认值更改为已选中,则可以使用未经检查的块或表达式再次获取未选中的行为。

答案 1 :(得分:26)

Check it

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}

答案 2 :(得分:8)

尝试:

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}

答案 3 :(得分:8)

编译器假设您希望以这种方式执行并继续执行溢出。如果需要将溢出视为操作的异常,请将操作包装在checked周围,并在运行时抛出异常。

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}
  

System.OverflowException:异常   类型System.OverflowException是   抛出。