关于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
猜你喜欢
- 模板方法模式模板方法模式法(Template Method)定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算
- 后台控制层: public static final String HEAD_IMG_DIR = "D:/upload/&quo
- 如下所示://读取json文件地址 /* String path = getClass().getClassLoader().g
- Mybatis plus中like查询问题又谈到了Mybatis plus了,真的很是痛心疾首,在做模糊查询的时候出现了一个问题,版本还是2
- 组件在容器(比如Jframe)中的位置和大小是由布局管理器来决定的。所有的容器都会使用一个布局管理器,通过它来自动进行组件的布局管理。种类j
- Spring中提供了很多PostProcessor供开发者进行拓展,例如:BeanPostProcessor、BeanFactoryPost
- 1、自定义实现该类package com.linmain.dict.handle;import org.apache.ibatis.sess
- 一、存储Bean对象之前我们存储Bean时,需要在spring-config.xml中添加bean注册才行,这样的方式并不简单。我们要想更简
- 前言在java里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对
- 想要制作一个简易的登录界面非常容易,总体上来说就是UI布局、给定id、新建跳转的页面、以及输入账号密码的获取与判断,那么接下来就开始制作吧!
- IDEA创建一个传统JAVA WEB项目(不使用maven构建)方法一File --> NEW --> Project --&g
- 在我的工作经验中,在C#语言本身的学习上花了大量的时间,积累了一些经验,一些是在学习和工作中遇到的问题和解决办法分享出来,希望大家也能有收获
- 在 Java SE 6 所提供的诸多新特性和改进中,值得一提的是为 Java 程序提供数据库访问机制的 JDBC 版本升级到了 4.0, 这
- 本文的控制台项目是根据SuperSocket官方Telnet示例代码进行调试的,官方示例代码:Telnet示例。开始我的第一个Telnet控
- 通过这篇文章通过实例代码向大家介绍了Spring实例化bean的几种方法,接下来看看具体内容吧。1.使用类构造器实现实例化(bean的自身构
- 里氏替换原则(LSP)定义:在任何父类出现的地方都可以用它的子类类替换,且不影响功能。解释说明:其实LSP是对开闭原则的一个扩展,在OO思想
- using System.Collections.Generic;using System.Linq;using System.Refle
- 本文实例讲述了C#实现翻转字符串的方法。分享给大家供大家参考。具体实现方法如下:Func<string, string> Rev
- [DllImport("User32.dll", CharSet = CharSet.Auto)]  
- 介绍本文实现的功能有:1、播放音乐2、自定义流星数量、飞行速度、光晕大小、流星大小3、自定义表白话语 运用到的知识点有:GUI:j