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

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

public const ulong MaxValues2 = 0xFFFD0002FFFF;

最佳答案

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

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

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

关于c# - 尝试在编译时分配一个大数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10021046/

10-10 13:50