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?
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With