Question

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?

Was it helpful?

Solution

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

OTHER TIPS

1073741824 is an int, not a UInt64.
Therefore, your multiplication overflows the limit of a 32-bit signed integer.

Add the ul (unsigned long) suffix to either operand.

You've got an error because you operate with int instead of long 1073741824 is still int (max for int is 2147483647).
So in first case you get overflow of int type.
Change first expression with:

UInt64 value1 = 1073741824L * 8;

and problem will disappear.

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