关于C#数强转会不会抛出异常详解

 更新时间:2018年04月08日 10:18:15   作者:lindexi  
这篇文章主要给大家介绍了关于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类型)被重复相乘越来越大,乃至变成了无穷大。才意识到不仅除零会出现无穷大,大数相乘也会出现无穷大。大家以后小心。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • C# 监控 Windows 文件夹的方法

    C# 监控 Windows 文件夹的方法

    这篇文章主要介绍了C# 监控 Windows 文件夹的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C#判断获取的是文件夹还是文件的实例

    C#判断获取的是文件夹还是文件的实例

    今天小编就为大家分享一篇C#判断获取的是文件夹还是文件的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 详解C#使用AD(Active Directory)验证内网用户名密码

    详解C#使用AD(Active Directory)验证内网用户名密码

    这篇文章主要介绍了详解C#使用AD(Active Directory)验证内网用户名密码的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
    2017-10-10
  • C#简单创建和删除目录的方法

    C#简单创建和删除目录的方法

    这篇文章主要介绍了C#简单创建和删除目录的方法,实例分析了C#使用CreateDirectory及Delete方法简单创建及删除目录的相关实现技巧,需要的朋友可以参考下
    2015-08-08
  • C# OleDbDataReader快速数据读取方式(3种)

    C# OleDbDataReader快速数据读取方式(3种)

    这篇文章主要介绍了C# OleDbDataReader快速数据读取方式(3种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • C#操作xml文件之Linq To Xml详解

    C#操作xml文件之Linq To Xml详解

    Linq To Xml,不看其他,单纯的看名字都能感觉到,其可以使用灵活且强大的Linq语法,同时也可以使用lambda以及Xpath定位。本文将利用C#实现操作Linq To Xml,感兴趣的可以了解一下
    2022-11-11
  • Unity UGUI的Toggle复选框组件使用详解

    Unity UGUI的Toggle复选框组件使用详解

    这篇文章主要为大家介绍了Unity UGUI的Toggle复选框组件使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • C#中获取各种文件名的实现方式

    C#中获取各种文件名的实现方式

    这篇文章主要介绍了C#中获取各种文件名的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Unity制作游戏自定义按键详解

    Unity制作游戏自定义按键详解

    这篇文章主要介绍了在Unity中如何实现游戏自定义按键,文中的示例代码讲解详细,对我们学习Unity有一定帮助,感兴趣的可以跟随小编学习一下
    2022-01-01
  • C#模拟浏览器实现自动操作

    C#模拟浏览器实现自动操作

    这篇文章主要为大家详细介绍了如何使用C#实现模拟浏览器实现自动操作,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11

最新评论