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

时间:2014-10-06 21:25:53

标签: c# .net language-lawyer

在未经检查的上下文中,是否将一个值添加到值为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 ++中,它对两者都是完全有效的。首先检查"和"第二次检查"要打印,因为优化器可以重复使用第一次检查的结果。

C#也是如此吗?

2 个答案:

答案 0 :(得分:9)

来自规范:

  

4.1.5积分类型

     

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

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

答案 1 :(得分:0)

MSDN

  

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