在未经检查的上下文中,是否将一个值添加到值为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#也是如此吗?
答案 0 :(得分:9)
来自规范:
4.1.5积分类型
checked和unchecked运算符和语句用于控制整数类算术运算和转换的溢出检查(第7.6.12节)。在已检查的上下文中,溢出会产生编译时错误或导致抛出System.OverflowException。 在未经检查的上下文中,忽略溢出,并且丢弃任何不适合目标类型的高位。
这是我能找到的行为的唯一描述,但似乎已经足够了。所以,是的,向Int32.MaxValue
添加一个将导致使用二进制补码表示的值-1
。
答案 1 :(得分:0)
MSDN:
用于算术,转换或转换操作 OverflowException,操作必须在已检查的上下文中进行。通过 默认情况下,Visual Basic中的算术运算和溢出都是 检查;在C#中,它们不是。如果操作发生在未选中状态 在上下文中,通过丢弃任何高位来截断结果 不适合目的地类型。