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

作者:lindexi 时间:2021-11-09 05:44:48 

前言

在编程的过程中我们都知道有些错误是难以避免的,为了避免错误所带来的程序不友好所以程序当中引入了异常处理机制,又因为数据类型奇多和处理方式不同,应要求又有了数据转换的机制。

最近遇到一个小伙伴问我,从一个很大的数强转,会不会抛出异常。实际上不会出现异常。

最简单的代码是使用一个比 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类型)被重复相乘越来越大,乃至变成了无穷大。才意识到不仅除零会出现无穷大,大数相乘也会出现无穷大。大家以后小心。

来源:https://lindexi.gitee.io/lindexi/post/C-强转会不会抛出异常.html

标签:c#,强制转换,异常
0
投稿

猜你喜欢

  • 一文带你熟练掌握Java中的日期时间相关类

    2022-01-21 00:42:54
  • 详解C#借助.NET框架中的XmlTextReader类读取XML的方法

    2023-01-18 23:31:47
  • java读取其他服务接口返回的json数据示例代码

    2023-11-10 14:05:29
  • opencv实现轮廓高斯滤波平滑

    2023-07-23 02:05:56
  • Java使用Optional实现优雅避免空指针异常

    2023-06-05 15:35:39
  • SpringBoot整合rockerMQ消息队列详解

    2021-10-03 10:55:14
  • android自定义view之模拟qq消息拖拽删除效果

    2023-01-29 11:48:34
  • Java对象和Json文本转换工具类的实现

    2022-10-22 19:09:23
  • Android Flutter中Offstage组件的使用教程详解

    2023-08-20 01:01:44
  • Android 中的危险权限详细整理

    2023-12-03 09:07:25
  • C#数值转换-显式数值转换表(参考)

    2023-05-26 22:26:15
  • mybatis-plus QueryWrapper 添加limit方式

    2022-12-09 02:08:11
  • Idea中maven项目实现登录验证码功能

    2023-11-29 16:50:51
  • Spring Boot 2.0 配置属性自定义转换的方法

    2021-10-18 12:07:44
  • 详解Java实现缓存(LRU,FIFO)

    2022-04-24 13:35:26
  • java实现文件拷贝的七种方式

    2023-07-20 19:01:41
  • struts2实现多文件上传的示例代码

    2022-03-09 23:40:54
  • Java将json对象转换为map键值对案例详解

    2023-11-28 07:38:43
  • SpringBoot搭配AOP实现自定义注解

    2022-04-07 01:21:59
  • 一篇超详细的Spring Boot整合Mybatis文章

    2022-01-27 10:02:58
  • asp之家 软件编程 m.aspxhome.com