问题描述
我有一个理论,即从long
到int
的值大于int.MaxValue
或小于int.MinValue
的转换会导致异常。我当时遇到的问题是确定要抛出哪种类型的异常。我自然地以为它是OverflowException
或InvalidCastException
,但是想象一下,当以下代码片段根本没有爆炸时,我会感到惊讶!
int x = 0;
long y = int.MaxValue;
y += 3;
try {
x = (int)y;
} catch (Exception e) {
Console.WriteLine(e.GetType());
}
取而代之的是等于int.MinValue + 2
的值:
x: -2147483646
int.MinValue: -2147483648
因此,我的好奇心在这一点上对我来说是最好的,并且我已经进行了大量的挖掘工作,以了解我可以通过利用{{来引发异常(由于this post) 1}}关键字(强调我的关键字):
可以通过编译器选项,环境配置或使用checked关键字来启用溢出检查。以下示例... 两个示例都引发溢出异常。
意思是,如果我只使用checked
关键字,就会抛出checked
(是):
OverflowException
阅读this article on MSDN后,我了解到默认行为是允许溢出发生:
默认情况下,也不会在运行时检查这些非常数表达式的溢出,并且它们不会引发溢出异常。上一个示例将-2,147,483,639显示为两个正整数之和。
TL / DR :为什么try {
x = checked((int)y);
} catch (Exception e) {
Console.WriteLine(e.GetType());
}
中的默认行为允许溢出发生?这不是导致意外行为吗?
注意:我知道位会翻转,这就是导致它变为负数的原因;我只是好奇为什么允许它翻转而不是默认抛出异常。简而言之,为什么我们必须明确声明我们希望事情爆炸?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)