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

依然范特西╮ 提交于 2019-12-08 15:02:24

问题


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?


回答1:


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




回答2:


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.




回答3:


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.



来源:https://stackoverflow.com/questions/10167219/uint64-and-the-operation-overflows-at-compile-time-in-checked-mode-cs0220

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!