试图在编译时分配一个大数字
本文关键字:一个 数字 编译 分配 | 更新日期: 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