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 OverflowExceptions. 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 OverflowExceptions. 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
OverflowExceptions.
Pros of Unchecked
Cons of Unchecked
FAQ
-
What happens if I don't use either
checkedorunchecked?
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 isuncheckedbehavior, meaning that overflows are silently truncated. However, it's best to be explicit and usecheckedoruncheckedto avoid ambiguity and ensure that your code behaves as expected. -
Can I enable
checkedglobally for my entire project?
Yes, you can enable overflow checking globally for your project by setting theCheckForOverflowUnderflowproperty totruein your project's .csproj file. This will make all integer arithmetic operationscheckedby default unless explicitly overridden withunchecked. -
Does
checkedaffect floating-point arithmetic?
No,checkedanduncheckedonly affect integer arithmetic operations. Floating-point operations follow the IEEE 754 standard, which defines how overflows, underflows, and other special values are handled.