关于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#实现一键清空控件值的示例代码

    C#实现一键清空控件值的示例代码

    这篇文章主要为大家详细介绍了如何利用C#语言实现一键清空控件值的功能,文中的示例代码讲解详细,对我们学习C#有一定帮助,需要的可以参考一下
    2022-09-09
  • C#获取文件相关信息的方法

    C#获取文件相关信息的方法

    这篇文章主要介绍了C#获取文件相关信息的方法,涉及C#中FileInfo类的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C#使用winform实现进度条效果

    C#使用winform实现进度条效果

    这篇文章主要为大家详细介绍了C#使用winform实现进度条效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • UGUI ScrollRect实现带按钮翻页支持拖拽

    UGUI ScrollRect实现带按钮翻页支持拖拽

    这篇文章主要为大家详细介绍了UGUI ScrollRect实现带按钮翻页支持拖拽,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C#显示文件夹下所有图片文件的方法

    C#显示文件夹下所有图片文件的方法

    这篇文章主要介绍了C#显示文件夹下所有图片文件的方法,涉及C#操作图片文件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • Winform界面中实现通用工具栏按钮的事件处理方法

    Winform界面中实现通用工具栏按钮的事件处理方法

    下面小编就为大家分享一篇Winform界面中实现通用工具栏按钮的事件处理方法,具有很好的参考价值,希望对大家有所帮助
    2017-11-11
  • C#实现简单的登录界面

    C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。
    2015-11-11
  • C# List 排序各种用法与比较

    C# List 排序各种用法与比较

    这篇文章主要介绍了C# List 排序各种用法与比较的相关资料,需要的朋友可以参考下
    2016-09-09
  • C# 设计模式系列教程-状态模式

    C# 设计模式系列教程-状态模式

    状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。
    2016-06-06
  • C#使用StringBuilder实现高效处理字符串

    C#使用StringBuilder实现高效处理字符串

    这篇文章主要为大家详细介绍了C#如何使用StringBuilder实现高效处理字符串,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01

最新评论