是否定义了C#/ .NET签名的整数溢出行为?

在未经检查的上下文中,将一个加到一个值为2147483647的整数,保证导致-2147483648?

例如,使用以下代码

const int first = int.MaxValue; int second = first; if ( second >= first ) { Console.WriteLine( "First check" ); } second++; if ( second >= first ) { Console.WriteLine( "Second check" ); } 

在C ++中,对于要打印的“First check”和“Second check”都是完全有效的,因为优化器可以重用第一次检查的结果。

C#也是如此吗?

从规格:

4.1.5积分类型

checked和unchecked运算符和语句用于控制整数类算术运算和转换的溢出检查(第7.6.12节)。 在已检查的上下文中,溢出会产生编译时错误或导致抛出System.OverflowException。 在未经检查的上下文中,将忽略溢出,并且将丢弃不适合目标类型的任何高位。

这是我能找到的行为的唯一描述,但似乎已经足够了。 所以是的,在Int32.MaxValue添加一个将使用二进制补码表示得到值-1

MSDN :

对于抛出OverflowException的算术,转换或转换操作,操作必须在已检查的上下文中进行。 默认情况下,检查Visual Basic中的算术运算和溢出; 在C#中,它们不是。 如果操作发生在未经检查的上下文中,则通过丢弃不适合目标类型的任何高位来截断结果。