为什么int32.maxvalue + 1溢出一个长?



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

public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + 1;

生成编译器错误,指出"操作在编译时在检查模式下溢出"。我知道我可以把它放在一个"未选中"的块中并且很好,但我的问题是为什么首先会出现错误?显然,多头可以容纳 int 的最大值加 1。

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

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

您可以通过以下方式解决此问题:

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

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

出现错误的原因在 C# 规范中指定。

请参阅 C# 规范第 4.1.5 节(整型类型)

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

在您的情况下,由于加法的两个操作数都可以用int表示,因此计算以整数类型完成。将其中一个操作数显式转换为long将导致long结果,因此不会发生溢出错误。

你的代码实际上看起来像这样:

(long)(int.MaxValue + 1)

但是,由于 .Net 框架在 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 = (long) int.MaxValue + 1;

最新更新