2012-04-05 20 views
3

以下两个操作是相同的。但是,由于“在检查模式下编译时操作溢出”,MaxValues1不会编译。有人能解释一下编译器发生了什么,以及如何避免在MaxValues2中使用硬编码值?试图在编译时指定一个大数字

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

public const ulong MaxValues2 = 0xFFFD0002FFFF; 
+0

请添加相应的语言标记...... – 2012-04-05 00:15:03

回答

4

为了得到签名文字,添加u后缀,并使其长l后缀。即您需要ul

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

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

“因而不适合长时间”。可能想改变这种说法? – 2012-04-05 00:23:55

+0

@KendallFrey我已经重新制定了这个部分,并且不确定我写的是不是很长或不适合int。长期当然是错误的。 – CodesInChaos 2012-04-05 00:26:25

1

我认为它其实并不是一个ulong,直到你在最后分配给它,尝试

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

MaxValues1你乘以3个的32位整数在一起,结果被暗示为其他32位,其溢出诠释,当你把操作变化乘以3 ulongs在一起,这将不会溢出,因为你推断结果是ulong

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

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

也为结果类型为基础计算的最大类型的工作

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

将不能作为第2工作将溢出INT

+0

这让它工作。 0xFFFF实际上是硬编码的常量,在我不能改变的源文件中。增加ulong似乎已经解决了这个问题。谢谢。 – 2012-04-05 00:24:56

+0

@George,如果这解决了你的问题,你应该点击答案左边的复选标记。 – 2012-04-05 00:30:25

2

默认情况下,整数文字是的键入int。您可以添加'UL'后缀以将其更改为ulong文字。

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

public const ulong MaxValues2 = 0xFFFD0002FFFFUL; 
相关问题