0

我写了下面行C#_controlfp并不妨碍DivideByZeroException

using System; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] 
     extern static uint _controlfp(uint newcw, uint mask); 

     const uint _MCW_EM = 0x0008001f; 
     public const uint EM_INVALID = 0x00000010; 
     public const uint EM_DENORMAL = 0x00080000; 
     public const uint EM_ZERODIVIDE = 0x00000008; 
     public const uint EM_OVERFLOW = 0x00000004; 
     public const uint EM_UNDERFLOW = 0x00000002; 
     public const uint EM_INEXACT = 0x00000001; 

     static void MaskFpu(uint pExceptionMask = EM_INVALID) 
     { 
      // add desired values 
      _controlfp(_MCW_EM, pExceptionMask); 
     } 

     static void Main(string[] args) 
     { 
      MaskFpu(EM_ZERODIVIDE); 

      int a = 0; 
      var b = 5/a; 

      Console.WriteLine("b = " + b); 
     } 
    } 
} 

Main方法开始通过设置控制字。显然我想要DivideByZeroExceptions被屏蔽。

执行完_controlfp后,我期望零除以返回NaN。但是var b = 5/a反而会引发异常。

我该如何真正让我的过程不会引发DivideByZeroExceptions?

+0

如果你实际上只是在你的测试中使用了浮点类型,你不会需要任何这个容易出错的遗留垃圾。尝试一下。 – leppie

+1

我期望'controlfp'来控制*浮点操作 - 你正在执行整数操作。尝试使用'0.0'或'5.0',看看是否可以帮助你... –

+1

也许[this](https://msdn.microsoft.com/en-us/library/aa261190%28v=vs.60%29。 aspx)将有助于:_“随后可通过调用_ _controlfp(EM_ZERODIVIDE,EM_ZERODIVIDE)”_ – DGibbs

回答

0
int a = 0; 
var b = 5/a; 

您正在执行整数运算,因此屏蔽浮点异常对此表达式没有影响。

相关问题