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

Cyb*_*ist 33 c# windows-phone-7

无论如何,这有什么用呢?我做了一个简单的乘法:

Int64 x = 11111111111;
Int64 y = 11111111111;
Int64 z = x * y;
Run Code Online (Sandbox Code Playgroud)

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

-5670418394979206991

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

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

Mar*_*ers 43

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

checked
{
    long x = 11111111111;
    long y = 11111111111;
    long z = checked(x * y);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这导致异常:

OverflowException:算术运算导致溢出.

如果您只是在需要检查的单个操作中,则可以使用选中的表达式:

long x = 11111111111;
long y = 11111111111;
long z = checked(x * y);
Run Code Online (Sandbox Code Playgroud)

您还可以设置/ checked编译器选项以选中默认值.

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

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

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

  • 请注意,未选中的原因是默认值是因为(1)99%的时间整数算术不在边界附近,(2)检查算术的速度慢.这是由于性能原因,C#的设计选择默认危险的罕见情况之一. (25认同)

Dar*_*rov 26

检查一下:

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}
Run Code Online (Sandbox Code Playgroud)

  • 答对了!我每天都在学习新东西!谢谢.谢天谢地. (6认同)

IVl*_*lad 8

尝试:

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}
Run Code Online (Sandbox Code Playgroud)


thi*_*eek 8

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

checked
{
    Int64 x = 11111111111;
    Int64 y = 11111111111;
    Int64 z = x * y;
}
Run Code Online (Sandbox Code Playgroud)

System.OverflowException:抛出了System.OverflowException类型的异常.