以下两项操作完全相同。但是,由于“在检查模式下编译时操作溢出”,MaxValues1将无法编译。有人可以解释一下编译器发生了什么,以及如何在不使用MaxValues2中的硬编码值的情况下解决它?
public const ulong MaxValues1 = 0xFFFF * 0xFFFF * 0xFFFF;
public const ulong MaxValues2 = 0xFFFD0002FFFF;
答案 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。