以下两个操作是相同的。但是,MaxValues1 将无法编译,因为“在检查模式下编译时操作溢出”。有人可以解释一下编译器发生了什么以及我如何绕过它而不必使用 MaxValues2 中的硬编码值?
public const ulong MaxValues1 = 0xFFFF * 0xFFFF * 0xFFFF;
public const ulong MaxValues2 = 0xFFFD0002FFFF;
以下两个操作是相同的。但是,MaxValues1 将无法编译,因为“在检查模式下编译时操作溢出”。有人可以解释一下编译器发生了什么以及我如何绕过它而不必使用 MaxValues2 中的硬编码值?
public const ulong MaxValues1 = 0xFFFF * 0xFFFF * 0xFFFF;
public const ulong MaxValues2 = 0xFFFD0002FFFF;
要获得无符号文字,请添加u
后缀,并使它们长为l
后缀。即你需要ul
。
如果你真的想要溢出行为,你可以添加unchecked
getunchecked(0xFFFF * 0xFFFF * 0xFFFF)
但这可能不是你想要的。你会得到溢出,因为文字被解释为Int32
而不是ulong
,并且0xFFFF * 0xFFFF * 0xFFFF
不适合 32 位整数,因为它大约是 2^48。
public const ulong MaxValues1 = 0xFFFFul * 0xFFFFul * 0xFFFFul;
默认情况下,整数文字的类型是int
. 您可以添加“UL”后缀以将它们更改为ulong
文字。
public const ulong MaxValues1 = 0xFFFFUL * 0xFFFFUL * 0xFFFFUL;
public const ulong MaxValues2 = 0xFFFD0002FFFFUL;
为每个数字添加数字后缀“UL”。否则,C# 将它们视为 Int32。
我认为它实际上不是一个ulong
,直到你最后分配它,尝试
public const ulong MaxValues1 = (ulong)0xFFFF * (ulong)0xFFFF * (ulong)0xFFFF;
即在MaxValues1
您将 3 个 32 位整数相乘在一起时溢出,因为结果暗示为另一个 32 位整数,当您将操作更改为乘以 3ulongs
时,这不会溢出,因为您推断结果是ulong
(ulong)0xFFFF * 0xFFFF * 0xFFFF;
0xFFFF * (ulong)0xFFFF * 0xFFFF;
也可以作为结果类型根据最大类型计算
但
0xFFFF * 0xFFFF * (ulong)0xFFFF;
将不起作用,因为前 2 个将溢出 int