有符号整数溢出行为
本文关键字:溢出 整数 符号 | 更新日期: 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:的报价
检测二补码和溢出的规则很简单:
- 如果两个正数的和产生负结果,则表示和溢出
- 如果两个负数的和得到一个正数,则表示和溢出
- 否则,这笔款项就不会超支
的规则#2
http://sandbox.mc.edu/~bennet/cs110/tc/orles.html
不正确
- 如果两个负数之和产生正数结果,则该和已溢出
反例:
int a = int.MinValue;
int b = int.MinValue;
unchecked {
// 0
Console.Write(a + b);
}
然而,该规则可以简单地修改
- 如果两个负数的和产生非负结果,则该和已溢出
关于规则#1
- 如果两个正数的和产生负结果,则表示和溢出
正确一个
不,不能。
您已经讨论了checked
上下文,其中您知道溢出会导致抛出异常。然而,您似乎认为缺少checked
关键字表明您处于unchecked
上下文中。事实并非如此。未指定checked
和unchecked
时的默认上下文是可配置的,在共享同一源文件的多个项目中可能不同,甚至在同一项目的不同配置之间也可能不同。
如果要包装整数溢出,请显式使用unchecked
关键字。