代码之家  ›  专栏  ›  技术社区  ›  Cyberherbalist

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

  •  33
  • Cyberherbalist  · 技术社区  · 14 年前

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

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

    在乘法的末尾,z表示:

    -5670418394979206991

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

    注意这是在WindowsPhone7上,但我认为这与问题没有任何关系。还是这样?

    4 回复  |  直到 14 年前
        1
  •  43
  •   Mark Byers    14 年前

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

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

    这导致了一个例外:

    溢出异常:算术运算导致溢出。

    如果您只是在需要检查的地方执行单个操作,则可以使用 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. 修改 检查算术溢出/下溢属性 .

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

        2
  •  26
  •   Darin Dimitrov    14 年前

    Check it :

    checked
    {
        Int64 x = 11111111111;
        Int64 y = 11111111111;
        Int64 z = x * y;
    }
    
        3
  •  8
  •   IVlad    14 年前

    尝试:

    checked
    {
        Int64 x = 11111111111;
        Int64 y = 11111111111;
        Int64 z = x * y;
    }
    
        4
  •  8
  •   this. __curious_geek    14 年前

    编译器假定您希望这样做并继续溢出。如果需要将溢出视为操作的例外,请将该操作环绕 checked 它将在运行时抛出一个异常。

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

    System.OverflowException:异常 类型为System.OverflowException的 投掷。