C# > Core C# > Operators and Expressions > Checked and Unchecked Expressions
Checked and Unchecked Arithmetic Operations in C#
This example demonstrates the use of checked
and unchecked
keywords in C# to control overflow checking during arithmetic operations. Understanding these keywords is crucial for writing robust and reliable numerical code, especially when dealing with potential overflow situations.
Introduction to Checked and Unchecked
In C#, the checked
and unchecked
keywords control whether the runtime environment throws an exception when an integer arithmetic operation results in a value outside the range of the data type. By default, integer overflow is often silently truncated (unchecked behavior). The checked
keyword forces an OverflowException
to be thrown, allowing you to handle the overflow gracefully. The unchecked
keyword explicitly suppresses the overflow checking.
Checked Example: Detecting Overflow
This code demonstrates the checked
keyword. When maxValue + 1
is evaluated within the checked
block, it results in an integer overflow. Because overflow checking is enabled, an OverflowException
is thrown, and the catch
block handles the exception, preventing the program from continuing with an incorrect value. The output shows the overflow exception message.
using System;
public class CheckedExample
{
public static void Main(string[] args)
{
try
{
int maxValue = int.MaxValue;
checked
{
int result = maxValue + 1;
Console.WriteLine("Result (should not be reached): " + result);
}
}
catch (OverflowException ex)
{
Console.WriteLine("Overflow Exception caught: " + ex.Message);
}
}
}
Unchecked Example: Ignoring Overflow
This code demonstrates the unchecked
keyword. When maxValue + 1
is evaluated within the unchecked
block, it results in an integer overflow, but no exception is thrown. Instead, the value wraps around to int.MinValue
, which is then printed to the console. The output will be a negative number because of the wrap-around.
using System;
public class UncheckedExample
{
public static void Main(string[] args)
{
int maxValue = int.MaxValue;
unchecked
{
int result = maxValue + 1;
Console.WriteLine("Result (Unchecked): " + result);
}
}
}
Concepts Behind the Snippet
The core concept is managing the behavior of integer arithmetic operations when they exceed the maximum or minimum representable value for a given integer type. Without explicit checking, overflows can lead to unexpected and potentially dangerous behavior in your application. The checked
and unchecked
keywords provide explicit control over this behavior.
Real-Life Use Case
In financial applications, dealing with monetary values requires extreme precision. An unchecked overflow could lead to incorrect balances or fraudulent transactions. Using checked
arithmetic ensures that such errors are detected and handled, preventing potentially serious financial consequences. Another scenario might be physics simulations where calculations must remain within certain bounds to correctly model the environment.
Best Practices
checked
by Default: It's generally recommended to enable overflow checking by default, especially in critical sections of your code. You can enable it globally for your project in the compiler settings.checked
, ensure that you have appropriate exception handling in place to deal with OverflowException
s. This may involve logging the error, retrying the operation with a different data type, or terminating the operation.unchecked
Judiciously: Only use unchecked
when you specifically need to suppress overflow checking, and you understand the implications of doing so. This might be appropriate in performance-critical code where the overhead of checking is unacceptable, and you can guarantee that overflows will not cause problems.
Interview Tip
Be prepared to explain the difference between checked
and unchecked
, and give examples of situations where each would be appropriate. Also, be ready to discuss the performance implications of using checked
and how to handle OverflowException
s. Understanding how to control integer overflow is a sign of a careful and conscientious developer.
When to use them
checked
: Use checked
when you want to ensure that integer arithmetic operations do not silently overflow, potentially leading to incorrect results. This is especially important in financial calculations, scientific simulations, and any other situation where accuracy is critical.unchecked
: Use unchecked
when you specifically want to ignore integer overflow, either for performance reasons or because the overflow is intentional and handled elsewhere. Be very careful when using unchecked
, as it can lead to unexpected behavior if not used correctly.
Memory footprint
The checked
keyword itself doesn't directly increase memory footprint. However, the compiler might insert additional instructions to perform overflow checks. This can potentially increase the code size slightly. The unchecked
keyword also doesn't directly affect memory footprint. The actual memory usage depends on the data types involved in the arithmetic operations, and that remains the same regardless of whether you use checked
or unchecked
.
Alternatives
Alternatives to using checked
and unchecked
include:long
instead of int
) to accommodate the larger range of values.BigInteger
: The BigInteger
structure in the System.Numerics
namespace can represent arbitrarily large integers, eliminating the possibility of overflow altogether. However, BigInteger
operations are generally slower than native integer operations.
Pros of Checked
Cons of Checked
OverflowException
s.
Pros of Unchecked
Cons of Unchecked
FAQ
-
What happens if I don't use either
checked
orunchecked
?
The default behavior for integer overflow in C# depends on the compiler settings and the context in which the code is executed. In many cases, the default isunchecked
behavior, meaning that overflows are silently truncated. However, it's best to be explicit and usechecked
orunchecked
to avoid ambiguity and ensure that your code behaves as expected. -
Can I enable
checked
globally for my entire project?
Yes, you can enable overflow checking globally for your project by setting theCheckForOverflowUnderflow
property totrue
in your project's .csproj file. This will make all integer arithmetic operationschecked
by default unless explicitly overridden withunchecked
. -
Does
checked
affect floating-point arithmetic?
No,checked
andunchecked
only affect integer arithmetic operations. Floating-point operations follow the IEEE 754 standard, which defines how overflows, underflows, and other special values are handled.