3

以下两个操作是相同的。但是,MaxValues1 将无法编译,因为“在检查模式下编译时操作溢出”。有人可以解释一下编译器发生了什么以及我如何绕过它而不必使用 MaxValues2 中的硬编码值?

public const ulong MaxValues1 = 0xFFFF * 0xFFFF * 0xFFFF;

public const ulong MaxValues2 = 0xFFFD0002FFFF;
4

4 回答 4

4

要获得无符号文字,请添加u后缀,并使它们长为l后缀。即你需要ul

如果你真的想要溢出行为,你可以添加uncheckedgetunchecked(0xFFFF * 0xFFFF * 0xFFFF)但这可能不是你想要的。你会得到溢出,因为文字被解释为Int32而不是ulong,并且0xFFFF * 0xFFFF * 0xFFFF不适合 32 位整数,因为它大约是 2^48。

public const ulong MaxValues1 = 0xFFFFul * 0xFFFFul * 0xFFFFul;
于 2012-04-05T00:19:58.970 回答
2

默认情况下,整数文字的类型是int. 您可以添加“UL”后缀以将它们更改为ulong文字。

public const ulong MaxValues1 = 0xFFFFUL * 0xFFFFUL * 0xFFFFUL;

public const ulong MaxValues2 = 0xFFFD0002FFFFUL;
于 2012-04-05T00:21:22.360 回答
1

为每个数字添加数字后缀“UL”。否则,C# 将它们视为 Int32。

C# - 数字后缀

于 2012-04-05T00:21:37.487 回答
1

我认为它实际上不是一个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

于 2012-04-05T00:20:13.180 回答