使用中间变量交换两个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上下文。如果发生算术溢出,程序不会出错,可能得到正确或错误的结果。

关于C#中的算术运算的更多相关文章

  1. EL语言表达式 (三)【EL中的算术运算以及判断EL对象是否为空】

    一.EL中的算术运算 EL和其他语言一样,同样也提供了基本的算术运算(加.减.乘.除和取余),如下图. 运算符 功能 示例 结果 + 加 ${19+1} 20 - 减 ${66-30} 36 * 乘 ...

  2. bash中的算术运算

    bash中的算术运算     +, -, *, /, %     实现算术运算:         (1) let var=算术表达式          (2) var=$[算术表达式]         ...

  3. JavaScript 中的算术运算

    JavaScript中算术运算在溢出(overflow).下溢(underflow)或被零整除时不会报错,当数字运算结果超过了JavaScript所能表示的数字上限(溢出),结果为一个特殊的无穷大(i ...

  4. Shell中的算术运算(译)

    算术运算 尽管Shell中的变量被缺省地看做是string类型,而非number,但是Shell本身仍然支持算术运算.主要有以下5种方式. 1. declare 2. expr $ z=5 $ z=` ...

  5. Python学习-24.Python中的算术运算

    加法:+,与C#中并无区别,并且一样可以作用于字符串. 但Python中不支持字符串与数值类型的相加. i = 1 s = ' print(s + i) 这样是会在运行时报错的,正确写法如下: i = ...

  6. 总结在Linux终端中进行算术运算的6种方式

    1.使用bash 使用双括号可以像C语言一样直接使用运算符进行计算. +)) a=$((*)) echo $a b=$(($a-)) echo $b d=$(($b/)) echo $d e=$(($ ...

  7. [转]bat中的特殊字符,以及需要在bat中当做字符如何处理

    bat中的特殊字符,以及需要在bat中当做字符如何处理 批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @ \\隐藏命令的回显. ~ \\在for中表示使用增强的变量扩 ...

  8. Bat 中特殊符号

    批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set ...

  9. shell编程(二)之算术运算

    bash中的算术运算 +.-./.%.* 实现算术运算 1. let var=算术表达式 2. var=$[算术表达式] 3. var=$((算术表达式)) 4. var=$(expr arg1 ar ...

随机推荐

  1. 利用GPU实现翻页效果(分享自知乎网)

    https://zhuanlan.zhihu.com/p/28836892?utm_source=qq&utm_medium=social 首发于Runtime 写文章 利用GPU实现翻页效果 ...

  2. Oracle 存储过程_(收集)

    oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字(    参数1 IN NUMBER,    参数2 IN NUMBER) IS变量 ...

  3. 基于BP神经网络的字符识别研究

    基于BP神经网络的字符识别研究 原文作者:Andrew Kirillov. http://www.codeproject.com/KB/cs/neural_network_ocr.aspx 摘要:本文 ...

  4. shell脚本中常用命令

    1           Shell中的特殊符号 1.1           $  美元符号.用来表示变量的值.如变量NAME的值为Mike,则使用$NAME就可以得到“Mike”这个值. 1.2    ...

  5. @property_@synthesize 配套使用

    @property 类默认实现变量的get set方法 @synthesize 是指定那个变量的 get和set方法 eg: .h文件中定义 类Student中含有两个 int age,和int _a ...

  6. hihoCoder#1095(二分搜索)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi and Little Ho are playing a drinking game called HI ...

  7. js页面埋点

    页面埋点的作用,其实就是用于流量分析.而流量的意思,包含了很多:页面浏览数(PV).独立访问者数量(UV).IP.页面停留时间.页面操作时间.页面访问次数.按钮点击次数.文件下载次数等.而流量分析又有 ...

  8. Java-API-POI-Excel:SXSSFWorkbook Documentation

    ylbtech-Java-API-POI-Excel:SXSSFWorkbook Documentation 1.返回顶部 1. org.apache.poi.xssf.streaming Class ...

  9. Spring学习八

    1: Tomcat容器四个等级? Container, Engine,  Servlet容器, Context 真正管理Servlet的容器是Context容器:一个context对应一个web工程. ...

  10. 第一章 深入Web请求过程(待续)

    B/S网络架构概述 如何发起一个请求 HTTP解析 DNS域名解析 CDN工作机制