为什么int32.maxvalue + 1溢出很长时间?

时间:2014-01-31 19:41:13

标签: c# .net

如果将以下代码放在.NET 4.5应用程序中:

public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + 1;

生成编译器错误,声明"操作在编译时以检查模式溢出"。我知道我可以把它放在"未经检查的"阻止并且很好,但我的问题是为什么错误出现在第一位?很明显,long可以保持int的最大值加一。

请注意,使用Int32和Int64而不是long和int似乎没有帮助。

5 个答案:

答案 0 :(得分:17)

这是因为赋值右侧的计算是以整数类型完成的。它是溢出整数

你可以用以下方法解决这个问题:

public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + (long)1; // or 1L

通过将至少一个操作数转换为long

您收到错误的原因在C#规范中指定。

请参阅C# Specification Section 4.1.5 (Integral types)

  

对于二进制+, - ,*,/,%,&,^,|,==,!=,>,<,> =和< =   运算符,操作数转换为类型T,其中T是第一个   int,uint,long和ulong 可以完全代表所有可能的   两个操作数的值。然后使用。执行操作   类型T的精度,结果的类型是T(或bool为   关系运算符)。一个操作数不允许   使用二元运算符输入long,另一个类型为ulong。

在您的情况下,因为两个加法操作数都可以在int中表示,因此计算以整数类型完成。将操作数之一显式地转换为long将导致long结果,因此没有溢出错误。

答案 1 :(得分:4)

您的代码实际上是这样的:

(long)(int.MaxValue + 1)

但是因为.Net框架在int和long之间有一个内置的隐式转换,所以你不必在代码中明确地将转换设置为long。

首先,执行代码的这一部分:

int.MaxValue + 1

并且此操作的结果是int值,导致并溢出异常。 所以你的代码甚至没有机会开始从int到long的转换。

答案 2 :(得分:1)

我认为这与int.MaxValue + 1在转换为long之前计算的值有关。当然long可以保存该值,但是由于您正在进行整数加法,因此无法在整数转换中将int.MaxValue + 1的整数值存储在int中。

答案 3 :(得分:1)

尝试

public const long MAXIMUM_RANGE_MAGNITUDE = (long)int.MaxValue + 1L;

答案 4 :(得分:1)

将常量值转换为long。

public const long MAXIMUM_RANGE_MAGNITUDE = (long) int.MaxValue + 1;