有符号整数溢出行为

时间:2016-07-21 14:23:10

标签: c# integer-overflow

当添加两个阳性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. 如果两个负数的总和产生正结果,则总和已溢出。
  4.   
  5. 否则,总和没有溢出。
  6.   

2 个答案:

答案 0 :(得分:4)

来自

的规则#2

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

不正确

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

反例:

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

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

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

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

关于规则#1

  
      
  1. 如果两个正数的总和产生负结果,则总和已溢出。
  2.   

正确一个

答案 1 :(得分:1)

不,你不能。

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

如果要将整数溢出换行显式,请使用unchecked关键字。