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
  •  | 
  •  

문제

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?

도움이 되었습니까?

해결책

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top