有符号整数溢出行为

4
当两个正的Int32值相加的理论结果大于Int32.MaxValue时,我可以指望溢出的值总是为负吗?我的意思是这样做是为了检查溢出而不使用检查上下文和异常处理(就像在此处提出的那样:http://sandbox.mc.edu/~bennet/cs110/tc/orules.html),但这种行为是否得到保证?从我目前所了解的情况来看,在C#中有符号整数溢出是定义行为(Is C#/.NET signed integer overflow behavior defined?)(与C/C++相比),而Int32是二补码,所以我会感激对这个主题有更好了解的人来验证这一点。
更新 引用来自链接1: “在二进制补码求和中检测溢出的规则很简单: 1. 如果两个正数的和产生负结果,则和已经溢出。 2. 如果两个负数的和产生正结果,则和已经溢出。 3. 否则,总和未溢出。”
2个回答

4

来自http://sandbox.mc.edu/~bennet/cs110/tc/orules.html的规则 #2是错误的

  1. 如果两个负数相加的和得到了一个正数,那么这个和已经溢出了。

反例:

  int a = int.MinValue;
  int b = int.MinValue;

  unchecked {
    // 0
    Console.Write(a + b);
  }

然而,该规则可以简单地修改

  1. 如果两个负数的总和产生了一个非负数的结果,则其和已经溢出。

至于第一条规则

  1. 如果两个正数的总和为负数,则其和已溢出。

这是正确的规则。


1
不可以。
您已经谈论了“checked”上下文,其中您知道溢出会导致抛出异常。但是,您似乎假设缺少“checked”关键字意味着您处于“unchecked”上下文中。这并不一定是这样。当未指定“checked”或“unchecked”时的默认上下文是可配置的,可以在共享相同源文件的多个项目中不同,甚至可以在同一项目的不同配置之间不同。
如果要使整数溢出包装,请明确使用“unchecked”关键字。

我知道。虽然这可能值得向其他人指出,但我认为我提出问题的方式暗示了我打算在“unchecked”上下文中使用它。否则,我不会得到一个溢出的值,而是会得到一个“OverflowException”。 - ArgusMagnus
@ArgusMagnus,你提出问题的措辞让我觉得你是想在默认的隐式unchecked上下文中使用它,这是很危险的。我的回答重点是将其变成显式的unchecked上下文。 - user743382

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接