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

Bra*_*NET 7 .net c#

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

public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + 1;
Run Code Online (Sandbox Code Playgroud)

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

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

Hab*_*bib 17

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

你可以解决这个问题:

public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + (long)1; // or 1L
Run Code Online (Sandbox Code Playgroud)

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

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

参见C#规范第4.1.5节(积分类型)

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

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

  • 很好的答案,我尝试了几个你发布的代码的变体,但显然不是正确的!你的工作很棒. (2认同)