有符号整数溢出行为

本文关键字:溢出 整数 符号 | 更新日期: 2023-09-27 17:58:14

当将两个理论结果大于Int32.MaxValue的正Int32值相加时,是否可以指望溢出值始终为负?

我的意思是,这样做是为了在不使用已检查上下文和异常处理的情况下检查溢出(如这里所建议的:http://sandbox.mc.edu/~bennet/cs110/tc/orles.html),但这种行为被禁止了吗?

到目前为止,我所读到的是C#定义行为中的有符号整数溢出(C#/.NET有符号整数溢流行为定义了吗?)(与C/C++相反),Int32是两个补码,所以我很感谢比我更了解这个主题的人来验证这一点。

更新
来自链接1:的报价

检测二补码和溢出的规则很简单:

  1. 如果两个正数的和产生负结果,则表示和溢出
  2. 如果两个负数的和得到一个正数,则表示和溢出
  3. 否则,这笔款项就不会超支

有符号整数溢出行为

的规则#2

http://sandbox.mc.edu/~bennet/cs110/tc/orles.html

不正确

  1. 如果两个负数之和产生正数结果,则该和已溢出

反例:

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

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

  1. 如果两个负数的和产生非负结果,则该和已溢出

关于规则#1

  1. 如果两个正数的和产生负结果,则表示和溢出

正确一个

不,不能。

您已经讨论了checked上下文,其中您知道溢出会导致抛出异常。然而,您似乎认为缺少checked关键字表明您处于unchecked上下文中。事实并非如此。未指定checkedunchecked时的默认上下文是可配置的,在共享同一源文件的多个项目中可能不同,甚至在同一项目的不同配置之间也可能不同。

如果要包装整数溢出,请显式使用unchecked关键字。