C# 为什么int32.maxvalue+;一个长的?
如果将以下代码放入.NET 4.5应用程序中:C# 为什么int32.maxvalue+;一个长的?,c#,.net,C#,.net,如果将以下代码放入.NET 4.5应用程序中: public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + 1; 生成一个编译器错误,说明“在检查模式下,操作在编译时溢出”。我知道我可以把它放在一个“未检查”的块中,这样就可以了,但我的问题是,为什么错误会首先出现?很明显,long可以保存int的最大值加1 请注意,使用Int32和Int64而不是long和int似乎没有帮助。您的代码实际上如下所示: (long)(int.MaxVal
public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + 1;
生成一个编译器错误,说明“在检查模式下,操作在编译时溢出”。我知道我可以把它放在一个“未检查”的块中,这样就可以了,但我的问题是,为什么错误会首先出现?很明显,long可以保存int的最大值加1
请注意,使用Int32和Int64而不是long和int似乎没有帮助。您的代码实际上如下所示:
(long)(int.MaxValue + 1)
但由于.NETFramework在int和long之间有一个内置的隐式转换,所以您不必在代码中显式地将转换为long
因此,首先执行这部分代码:
int.MaxValue + 1
此操作的结果是一个int
值,该值会导致溢出异常。
因此,您的代码甚至没有机会开始从int到long的转换。我认为这与在转换为
long
之前计算int.MaxValue+1
的值有关。当然,long可以保存该值,但由于您正在进行整数加法,因此在进行转换之前,无法将int.MaxValue+1
的整数值存储在int中。请尝试
public const long MAXIMUM_RANGE_MAGNITUDE = (long)int.MaxValue + 1L;
这是因为赋值右侧的计算是以整数类型进行的。它是溢出整数 您可以通过以下方式解决此问题:
public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + (long)1; // or 1L
通过将至少一个操作数强制转换为long
得到错误的原因在C#规范中指定
见
对于二进制数+,–,*,/,%,&,^,|,=,!=,>,=,并将常量值转换为长值
public const long MAXIMUM_RANGE_MAGNITUDE = (long) int.MaxValue + 1;
它不会溢出很长一段时间;它溢出了一个int。当运行时计算它时,它会接受一个32位整数并向其中添加1。因此,唯一的方法是在未检查模式下执行此操作?回答得很好,我在您发布的代码上尝试了一些变体,但显然不是正确的变体!不过你的很好用。