UInt64 and "The operation overflows at compile time in checked mode" - CS0220

Robert Seder picture Robert Seder · Apr 16, 2012 · Viewed 7.1k times · Source

This feels like a stupid question, but I can't seem to see the answer. I have an UInt64, which is supposed to have a max value of

UInt64.MaxValue 18446744073709551615

However, when I try to assign a modest-sized number, I get this overflow error of "The operation overflows at compile time in checked mode". If I wrap it in an "unchecked" block then it compiles, and runs as if this variable is zero:

UInt64 value1 = 1073741824 * 8; // Compile error CS0220
UInt64 value2 = 8589934592;     // Actual value - no error

Why is this happenning?

Answer

vcsjones picture vcsjones · Apr 16, 2012

Because:

UInt64 value1 = 1073741824 * 8;

Is doing the arithmetic as a signed 32-bit integer, then converting it to an ulong. Try:

UInt64 value1 = 1073741824UL * 8;

The UL means that the literal is of an unsigned long. See section 2.4.4 of the C# Specification for more on literal suffixes:

If the literal is suffixed by UL, Ul, uL, ul, LU, Lu, lU, or lu, it is of type ulong