Why adding two large integers whose result greater than int.MaxValue doesn't throw overflow exception?

StackOverflow https://stackoverflow.com/questions/7122473

  •  06-01-2021
  •  | 
  •  

Question

If we are using the following loop in a program, the loop never ends in C# 4.0

for (int i = 1; i <= int.MaxValue; i++)
{
}

This is because adding 1 to int.MaxValue (2147483647) will not result in an overflow exception, but results in -2147483648 (taking into consideration 32bit int and 2's compliment).

int i = int.MaxValue;
Console.WriteLine(i + 1);

It seems the behavior changed recently. See the question Arithmetic operation caused OverflowException .What could be the reason behind this change?

Was it helpful?

Solution

Overflow exceptions for integer (and other integral types) are only done in checked contexts.

So, this will cause an exception:

checked
{
 int i = int.MaxValue;
  Console.WriteLine(i + 1);
}

They are not set to do this by default as they are more expensive than simply overflowing.

From MSDN:

The checked keyword is used to explicitly enable overflow checking for integral-type arithmetic operations and conversions.

And:

Overflow checking can be enabled by compiler options, environment configuration, or use of the checked keyword.


This is not a recent change - C# has been like this from day one. What you see in the question is VB.NET code, which is by default in a checked context.

So, keeping to defaults, overflowing code in VB.NET will throw an exception, but identical code in C# will not.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top