33

这到底是怎么回事?我做了一个简单的乘法:

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

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

-5670418394979206991

这显然已经溢出,但没有引发异常。我想养一个,但是...

请注意,这是在 Windows Phone 7 上,但我认为这与问题没有任何关系。或者是吗?

4

4 回答 4

43

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

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

这导致异常:

OverflowException:算术运算导致溢出。

如果你只是在做一个需要检查的操作,你可以使用一个检查的表达式

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

您还可以设置/checked 编译器选项以检查默认值。

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

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

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

于 2010-05-29T09:23:51.843 回答
26

检查它

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}
于 2010-05-29T09:16:39.960 回答
8

尝试:

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}
于 2010-05-29T09:17:18.210 回答
8

编译器假设您想这样做并继续溢出。如果需要将溢出视为操作异常,请将操作包装起来checked,它将在运行时抛出异常。

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

System.OverflowException:引发了 System.OverflowException 类型的异常。

于 2010-05-29T09:19:25.420 回答