【问题标题】:Signed integer overflow behaviour有符号整数溢出行为
【发布时间】:2016-07-21 14:23:09
【问题描述】:

当添加两个正的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. 否则,总和没有溢出。

【问题讨论】:

    标签: c# integer-overflow


    【解决方案1】:

    规则 #2 来自

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

    不正确

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

    反例:

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

    但是,规则可以简单地修改

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

    至于规则#1

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

    正确一个

    【讨论】:

      【解决方案2】:

      不,你不能。

      您已经讨论过checked 上下文,您知道溢出会导致抛出异常。但是,您似乎认为缺少 checked 关键字表明您在 unchecked 上下文中。情况不一定如此。 checkedunchecked 均未指定时的默认上下文是可配置的,在共享相同源文件的多个项目中可以不同,甚至在同一项目的不同配置之间也可以不同。

      如果您想对整数溢出进行换行,请明确说明,请使用 unchecked 关键字。

      【讨论】:

      • 我知道。虽然可能值得向其他人指出,但我认为我提出问题的方式意味着我的意思是在 unchecked 上下文中使用它。否则我不会得到一个溢出的值,而是一个OverflowException
      • @ArgusMagnus 您对问题的措辞对我来说意味着您的意思是在默认的隐式unchecked 上下文中使用它,这是有风险的。我的答案的重点是让它成为一个明确的unchecked 上下文。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2018-09-07
      • 2020-03-27
      相关资源
      最近更新 更多