关于C#中的算术运算
使用中间变量交换两个int型变量的值:
int a = ; int b = ; a = a+b; b = a-b; a = a-b;
相信大家很容易写出来,但考虑到边界值情况时会有一些有趣的事情。
我们知道有一个int.MaxValue和int.MinValue表示int型的最大值和最小值。
当我们直接定义:int a = int.MaxValue + 1的时候,编译器会提示出错:
在申明x变量时程序编译会报错。
但下面申明的变量a,b进行相加时可以肯定的是出现了算术溢出错误,但却依然可以得到正确的结果。
在执行完a = a+b后发现a的值变成了-3
而后面两步计算均能得出正确的结果….
解释:参考msdn操作符说明: https://msdn.microsoft.com/zh-cn/library/6a71f45d
操作符重载和隐式转换: https://msdn.microsoft.com/zh-cn/library/s53ehcz3
算术溢出
算术运算符(+、-、*、/)的计算结果可能会超出所涉数值类型的可取值范围。 详细信息应参考特定运算符的相关章节,而一般情况下:
- 整数算术溢出或者引发 OverflowException,或者放弃结果的最高有效位。 整数被零除总是引发 @System.DivideByZeroException。
发生整数溢出时,具体影响视执行上下文而定,上下文可为 checked 或 unchecked。 在 checked 上下文中引发 OverflowException。 在 unchecked 上下文中,放弃结果的最高有效位并继续执行。 因此,C# 让你有机会选择处理或忽略溢出。 默认情况下,算术运算发生在 unchecked 上下文中。
除算术运算以外,整型类型之间的显式转换也会导致溢出(例如,将 long 显式转换成 int),并受到 checked 或 unchecked 执行的约束。 但是,位运算符和移位运算符永远不会导致溢出。
- 浮点算术溢出或被零除从不引发异常,因为浮点类型基于 IEEE 754,因此可以表示无穷大和 NaN(非数值)。
- 小数算术溢出总是引发 OverflowException。 小数被零除总是引发 DivideByZeroException。
总结:大多数情况下数值计算很少有机会碰到溢出,但具体特殊场景应具体对待。
如:
1, 变量初始化时给定为int.MaxValue,在使用时一定要考虑计算溢出。
2, 在大量的循环或递归中计算时有可能会导致算术溢出。
3, 从IO输入设备中取值,尤其是用户输入的值中很有可能是一个溢出的无效输入。
4, 注意.NET CLR默认情况下算术运行是发生在unchecked上下文。如果发生算术溢出,程序不会出错,可能得到正确或错误的结果。
最新文章
- [CentOs7]搭建ftp服务器(2)——添加用户
- SQL Server常用的性能诊断语句
- python+selenium实现跨浏览器兼容性测试
- SpringMVC @Value取值(取properties属性文件的属性值)
- Spark RDD概念学习系列之RDD的缺点(二)
- BufferedReader的ready与readLine使用,以及Premature EOF异常
- pyqt QTableWidgetItem多行显示
- C语言--关键字 typedef
- HTML5+js页面传值给Java后台的小技巧
- python函数前篇
- jquery on()动态绑定元素的的点击事件无反应的问题记录
- eval及json的理解
- kettle无法更新数据库字段解决办法
- Linux之常用软件-服务
- C/S和B/S应用程序的区别
- 字符设备驱动(六)按键poll机制
- 微服务-封装-docker by daysn大雄
- 团队项目个人进展——Day09
- 删除RAC集群节点
- Angular vs. React - the tie breaker
热门文章
- Unity物体上下反复漂浮效果
- ftp上传下载 java FTPClient (zhuan)
- 异常java.sql.SQLException: Field 'id' doesn't have a default value
- zabbix3.2.1安装graphtrees插件
- [转载]python datetime处理时间
- 浅析Java中的深拷贝和浅拷
- SEO中常用HTML代码大全,及权重排序
- web基础(五)Jquery
- Ubuntu16.04 Hadoop2.6.0伪分布式安装与启动中遇到的问题
- C语言学习笔记--指针概念