试图在编译时分配一个大数字

时间:2012-04-05 00:14:06

标签: c# compiler-construction checked unchecked

以下两项操作完全相同。但是,由于“在检查模式下编译时操作溢出”,MaxValues1将无法编译。有人可以解释一下编译器发生了什么,以及如何在不使用MaxValues2中的硬编码值的情况下解决它?

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

public const ulong MaxValues2 = 0xFFFD0002FFFF;

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

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

public const ulong MaxValues2 = 0xFFFD0002FFFFUL;

答案 2 :(得分:1)

我认为它实际上不是ulong,直到你最后分配它,尝试

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

即。在MaxValues1中,你将3个32位整数乘以溢出,因为结果被暗示为另一个32位int,当你将op变化转换为乘以3 ulongs时不会溢出,因为你推断结果是一个ulong

(ulong)0xFFFF * 0xFFFF * 0xFFFF;

0xFFFF * (ulong)0xFFFF * 0xFFFF;

也可以工作,因为结果类型是根据最大类型计算的

但是

0xFFFF * 0xFFFF * (ulong)0xFFFF;

将无效,因为前2将溢出int

答案 3 :(得分:1)

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

C# - Numeric Suffixes