关于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类型)被重复相乘越来越大,乃至变成了无穷大。才意识到不仅除零会出现无穷大,大数相乘也会出现无穷大。大家以后小心。

总结

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

(0)

相关推荐

  • C#程序异常关闭时的捕获

    本文主要以一个简单的小例子,描述C# Winform程序异常关闭时,如何进行捕获,并记录日志. 概述 有时在界面的事件中,明明有try... catch 进行捕获异常,但是还是会有异常关闭的情况,所以在程序中如何最终的记录一些无法捕获的异常,会大大方便问题的定位分析及程序优化. 涉及知识点 以下两个异常事件,主要应用不同的场景. Application.ThreadException 在发生应用程序UI主线程中未捕获线程异常时发生,触发的事件. AppDomain.CurrentDomain.U

  • IIS下调用证书出现异常的解决方法 (C#)

    程序发布前,跑在vs上是没问题的,当发布后,程序就报错了.通过系统日志找到了错误所在:证书调用时出现了异常.原因是:在IIS上调用证书是需要配置的,具体配置如下: 一. 确保证书已安装 1. 点击 [开始] -> [运行] -> 键入[mmc] 进入"控制台"界面 -> 选择[文件] -> [添加/删除管理单元] 2. 选择[证书] -> [计算机账户] -> [下一步] -> [完成] 3. 选择[个人] -> [证书] -> [

  • C# 屏蔽由于崩溃弹出的windows异常弹框

    windows应用程序(包括控制台)在运行时如果出现了未处理的异常会出项windows的异常提示框 这个提示框在平时并没有什么影响.但是当我们使用启动的是一个服务器程序时,我们的要求应该是尽可能快的重启应用. 但是由于这个提示框导致我们的第三方守护程序并不知道应用已经崩溃退出,导致我们无法及时处理. 所以,我们应该在程序启动时再做一个处理,即添加未处理异常的事件 C#:   AppDomain.CurrentDomain.UnhandledException 解释: 此事件提供通知未捕获的异常.

  • C#异常捕获机制图文详解

    异常捕获机制 C# 1.示意图 2.异常捕获机制,代码: 3.异常捕获机制,结果: 4.求几周,剩余几天?代码: 5.结果: 6.求几月几周零几天 设一个月30天 代码: 7.结果:

  • C# WebApi 异常处理解决方案

    前言:上篇C#进阶系列--WebApi接口传参不再困惑:传参详解介绍了WebApi参数的传递,这篇来看看WebApi里面异常的处理.关于异常处理,作为程序员的我们肯定不陌生,记得在介绍 AOP的时候,我们讲过通过AOP可以统一截获异常.那么在我们的WebApi里面一般是怎么处理异常的呢,今天这一篇,博主带着大家一起来实践下WebApi的异常处理. 为什么说是实践?因为在http://www.asp.net里面已经明确给出WebApi的异常处理机制.光有理论还不够,今天我们还是来试一把.通过实践,

  • C#异常处理总结及简单实例

    C#异常处理总结及简单实例 一.异常处理的理解? 异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常. 因此处理这种错误,就称为异常处理. 二.异常处理如何操作? C# 异常处理时建立在四个关键词之上的:try.catch.finally 和 throw. 1.try:一个 try 块标识了一个将被激活的特定的异常的代码块.后跟一个或多个 catch 块. 2.catch:程序通过异常处理程序捕获异常.catch 关键字表示异常的捕获. 3.finally:finally

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

    前言 在编程的过程中我们都知道有些错误是难以避免的,为了避免错误所带来的程序不友好所以程序当中引入了异常处理机制,又因为数据类型奇多和处理方式不同,应要求又有了数据转换的机制. 最近遇到一个小伙伴问我,从一个很大的数强转,会不会抛出异常.实际上不会出现异常. 最简单的代码是使用一个比 maxvalue 大的数,然后用它强转 long tathkDucmmsc = int.MaxValue ; tathkDucmmsc *= 2; int kuplStqfbbmx = (int) tathkDuc

  • 最强Python可视化绘图库Plotly详解用法

    今天给大家分享一篇可视化干货,介绍的是功能强大的开源 Python 绘图库 Plotly,教你如何用超简单的(甚至只要一行)代码,绘制出更棒的图表. 我之前一直使用 matplotlib ,由于它复杂的语法,我已经"沉没"在里面太多的时间成本.这也导致我花费了不知多少个深夜,在 StackOverflow 上搜索如何"格式化日期"或"增加第二个Y轴". 但我们现在有一个更好的选择了 ,比如易于使用.文档健全.功能强大的开源 Python 绘图库

  • JS实现获取GIF总帧数的方法详解

    目录 前言 写在前面 思路分析 什么是Gif 组成结构 解析原理 数据块分析 Header Block Logical Screen Descriptor Global Color Table Graphics Control Extension Image Descriptor Image Data 实现代码 测试用例 插件地址 前言 有一个Gif图片,我们想要获取它的总帧数,超过一定帧数的图片告知用户不可上传,在服务端有很多现成的库可以使用,这种做法不是很友好,前端需要先将gif上传至服务端

  • 详解oracle中通过触发器记录每个语句影响总行数

    详解oracle中通过触发器记录每个语句影响总行数 需求产生: 业务系统中,有一步"抽数"流程,就是把一些数据从其它服务器同步到本库的目标表.这个过程有可能 多人同时抽数,互相影响.有测试人员反应,原来抽过的数,偶尔就无缘无故的找不到了,有时又会出来重复行.这个问题产生肯定是抽数逻辑问题以及并行的问题了!但他们提了一个简单的需求:想知道什么时候数据被删除了,什么时候插入了,我需要监控"表的每一次变更"! 技术选择: 第一就想到触发器,这样能在不涉及业务系统的代码情况

  • iOS对象指针和基础数据类型的强转详解

    本文主要介绍了iOS中对象指针和基础数据类型如何进行强转,下面话不多说,直接来看示例详解. 一.对象指针的强转: UIView *view = [UIView new];//new一个UIView类的对象 UILabel *label = (UILabel *)view;//强转成UILabel指针 label.text = @"123";//给label的text属性赋值(调用label的setText方法) 上述代码会产生崩溃,崩溃信息如下: -[UIView setText:]:

  • 动态统计当前输入内容的字节、字符数的实例详解

    动态统计当前输入内容的字节.字符数的实例详解 看到网上有好多利用charAt方法,原理也很简单,用正则判断是不是中文,如果是的话,字节数就加2,不是的话,字节数就加1. 后来发现另一种方式,由于一个汉字对应是两个字节,可利用正则,将匹配到的汉字用两个字符代替,例如:"xx",最后获得转化后的字符串的长度即是字节数. 而字符数就是对应有多少个汉字.字母.符号. //短信内容字数 $scope.bytesCount= 0; $scope.smsLength = 0; $scope.smsC

  • MySQL通过触发器解决数据库中表的行数限制详解及实例

    MySQL通过触发器解决数据库中表的行数限制详解及实例 最近项目一个需求是对操作日志的数量限制为10万条,超过十万条便删除最旧的那一条,保存数据库中日志数量不超过10万. 当时我的第一想法是通过触发器来做,便在数据库中执行了如下的SQL: delimiter $ create trigger limitLog before insert on OperationLog for each row begin if (select count(*) from OperationLog) > 1000

  • C语言实现“幸运数”的实例详解

    C语言实现"幸运数"的实例详解 1.题目: 标题:幸运数 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成. 首先从1开始写出自然数1,2,3,4,5,6,-. 1 就是第一个幸运数. 我们从2这个数开始.把所有序号能被2整除的项删除,变为: 1 _ 3 _ 5 _ 7 _ 9 -. 把它们缩紧,重新记序,为: 1 3 5 7 9 -. .这时,3为第2个幸运数,然后把所有能被3整除的序号位置的数删去.注意,是序号位置,不是那个数本身能否被3整除!

  • 详解Java对象的强、软、弱和虚引用+ReferenceQueue

    详解Java对象的强.软.弱和虚引用+ReferenceQueue 一.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题. 二.软引用(SoftReference) 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它:如果内存空间不足了,就会回收这些对象的内存.只要垃圾回

  • JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】

    本文实例讲述了JavaScript求一组数的最小公倍数和最大公约数常用算法.分享给大家供大家参考,具体如下: 方法来自求多个数最小公倍数的一种变换算法(详见附录说明) 最小公倍数的算法由最大公约数转化而来.最大公约数可通过如下步骤求得: (1) 找到a1,a2,..,an中的最小非零项aj,若有多个最小非零项则任取一个 (2) aj以外的所有其他非0项ak用ak mod aj代替:若没有除aj以外的其他非0项,则转到(4) (3) 转到(1) (4) a1,a2,..,an的最大公约数为aj 写

随机推荐