Best way to handle Integer overflow in C#?

前端 未结 6 405
臣服心动
臣服心动 2020-11-28 07:46

Handling integer overflow is a common task, but what\'s the best way to handle it in C#? Is there some syntactic sugar to make it simpler than with other languages? Or is th

相关标签:
6条回答
  • 2020-11-28 07:48

    Old thread, but I just ran into this. I didn't want to use exceptions. What I ended up with was:

    long a = (long)b * (long)c;
    if(a>int.MaxValue || a<int.MinValue)
        do whatever you want with the overflow
    return((int)a);
    
    0 讨论(0)
  • 2020-11-28 07:51

    Try the following

    int x = foo();
    try {
      int test = checked (x * common);
      Console.WriteLine("safe!");
    } catch (OverflowException) {
      Console.WriteLine("oh noes!");
    }
    
    0 讨论(0)
  • 2020-11-28 07:52

    Sometimes, the simplest way is the best way. I can't think a better way to write what you wrote, but you can short it to:

    int x = foo();
    
    if ((x * common) / common != x)
        Console.WriteLine("oh noes!");
    else
        Console.WriteLine("safe!");
    

    Note that I didn't remove the x variable because it'd be foolish to call the foo() three times.

    0 讨论(0)
  • 2020-11-28 08:02

    The best way is as Micheal Said - use Checked keyword. This can be done as :

    int x = int.MaxValue;
    try   
    {
        checked
        {
            int test = x * 2;
            Console.WriteLine("No Overflow!");
        }
    }
    catch (OverflowException ex)
    {
       Console.WriteLine("Overflow Exception caught as: " + ex.ToString());
    }
    
    0 讨论(0)
  • 2020-11-28 08:03

    I haven't needed to use this often, but you can use the checked keyword:

    int x = foo();
    int test = checked(x * common);
    

    Will result in a runtime exception if overflows. From MSDN:

    In a checked context, if an expression produces a value that is outside the range of the destination type, the result depends on whether the expression is constant or non-constant. Constant expressions cause compile time errors, while non-constant expressions are evaluated at run time and raise exceptions.

    I should also point out that there is another C# keyword, unchecked, which of course does the opposite of checked and ignores overflows. You might wonder when you'd ever use unchecked since it appears to be the default behavior. Well, there is a C# compiler option that defines how expressions outside of checked and unchecked are handled: /checked. You can set it under the advanced build settings of your project.

    If you have a lot of expressions that need to be checked, the simplest thing to do would actually be to set the /checked build option. Then any expression that overflows, unless wrapped in unchecked, would result in a runtime exception.

    0 讨论(0)
  • 2020-11-28 08:11

    So, I ran into this far after the fact, and it mostly answered my question, but for my particular case (in the event anyone else has the same requirements), I wanted anything that would overflow the positive value of a signed int to just settle at int.MaxValue:

    int x = int.MaxValue - 3;
    int someval = foo();
    
    try
    {
       x += someval;
    }
    
    catch (OverflowException)
    {
       x = int.MaxValue;
    }
    
    0 讨论(0)
提交回复
热议问题