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

本文关键字:一个 数字 编译 分配 | 更新日期: 2023-09-27 18:29:58

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

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

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

若要获得无符号文字,请添加u后缀,并使其变长为l后缀。即您需要CCD_ 3。

如果你真的想要溢出行为,你可以添加unchecked来获得unchecked(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。

C#-数字后缀

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

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

即,在MaxValues1中,您将3个32位int相乘,结果溢出,因为结果隐含为另一个32位整数,当您将运算更改为将3个ulongs相乘时,不会溢出,因为您推断结果是ulong

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

也起作用,因为结果类型是基于最大类型计算的

但是

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

将不起作用,因为前2个将溢出int