关于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#实现获取字符串阵列中元素最长或最短的长度方法,具有很好的参考价值,希望对大家有所帮助
    2017-12-12
  • Unity C#打包AssetBundle与场景详解

    Unity C#打包AssetBundle与场景详解

    这篇文章主要给大家介绍了关于Unity C#打包AssetBundle与场景的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • 解析C#中#region与#if的作用

    解析C#中#region与#if的作用

    以下是对C#中#region与#if的作用进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • C#基础知识之字符串和正则表达式

    C#基础知识之字符串和正则表达式

    目前为止许多编程语言和工具都包含对正则表达式的支持,C#也不例外,下面这篇文章主要给大家介绍了关于C#基础知识之字符串和正则表达式的相关资料,需要的朋友可以参考下
    2022-10-10
  • UGUI实现ScrollView无限滚动效果

    UGUI实现ScrollView无限滚动效果

    这篇文章主要为大家详细介绍了UGUI实现ScrollView无限滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C#利用递归算法解决汉诺塔问题

    C#利用递归算法解决汉诺塔问题

    这篇文章主要为大家介绍了C#如何利用递归算法解决经典的汉诺塔问题,文中的示例代码讲解详细,对我们学习C#有一定帮助,需要的可以参考一下
    2022-04-04
  • C#实现解析JSON的示例详解

    C#实现解析JSON的示例详解

    这篇文章主要为大家详细介绍了使用C#实现解析JSON的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • c#中list.FindAll与for循环的性能对比总结

    c#中list.FindAll与for循环的性能对比总结

    这篇文章主要给大家总结介绍了关于c#中list.FindAll与for循环的性能,文中通过详细的示例代码给大家介绍了这两者之间的性能,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
    2017-10-10
  • C#计算字符串相似性的方法

    C#计算字符串相似性的方法

    这篇文章主要介绍了C#计算字符串相似性的方法,实例分析了C#计算字符串相似性的原理与算法实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 使用C#实现在屏幕上画图效果的代码实例

    使用C#实现在屏幕上画图效果的代码实例

    本篇文章是对使用C#在屏幕上画图效果的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论