为什么默认情况下我们允许溢出?

问题描述

我有一个理论,即从longint的值大于int.MaxValue或小于int.MinValue的转换会导致异常。我当时遇到的问题是确定要抛出哪种类型的异常。我自然地以为它是OverflowExceptionInvalidCastException,但是想象一下,当以下代码片段根本没有爆炸时,我会感到惊讶!

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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...