关于C#数强转会不会抛出异常详解
前言
在编程的过程中我们都知道有些错误是难以避免的,为了避免错误所带来的程序不友好所以程序当中引入了异常处理机制,又因为数据类型奇多和处理方式不同,应要求又有了数据转换的机制。
最近遇到一个小伙伴问我,从一个很大的数强转,会不会抛出异常。实际上不会出现异常。
最简单的代码是使用一个比 maxvalue 大的数,然后用它强转
long tathkducmmsc = int.maxvalue ; tathkducmmsc *= 2; int kuplstqfbbmx = (int) tathkducmmsc; // -2
结果没有异常,只是拿到的值是 -2
但是因为默认是 unchecked 如果把上面的代码添加checked,那么就会出异常
checked { long tathkducmmsc = int.maxvalue; tathkducmmsc *= 2; int kuplstqfbbmx = (int) tathkducmmsc; }
system.overflowexception:“arithmetic operation resulted in an overflow.”
但是对于 float ,他的值就不是这样了
checked { double hcmzgssby = float.maxvalue; hcmzgssby *= 2; float djmmmkvawsswu = (float)hcmzgssby; }
可以看到 djmmmkvawsswu 的值是 infinity 不会出现异常,所以对于浮点数不要通过异常来判断强转是不是超过最大值。
那么如何判断 infinity ? 使用float.isinfinity或 double.isinfinity
都可以判断。
c#中的infinity有个小坑
我们知道,在c#中主要有如下几种数值类型:int、long、decimal、float和double。对于前三种,如果除零,那么会提示表达式错误(直接书写数字)或报dividebyzeroexception异常(使用变量);对于后面两种,除零会得到正负无穷大,除非你是0.0/0.0那么会得到nan(非数字)。大部分参考资料都是这样告诉大家的。
最近,之前的代码出现一个bug,老是出现infinity,然后排查了所有除法表达式,问题都无法解决。跟踪出现infinity之前的变量值,发现“1e+300 * 1e+10”的乘法,遂仔细研究代码逻辑,发现某些变量(double类型)被重复相乘越来越大,乃至变成了无穷大。才意识到不仅除零会出现无穷大,大数相乘也会出现无穷大。大家以后小心。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
推荐阅读