使用中间变量交换两个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. BZOJ3296:[USACO2011OPEN]Learning Language

    浅谈并查集:https://www.cnblogs.com/AKMer/p/10360090.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php? ...

  2. zabbix上的宏(macro)介绍

    宏:macro,预设的文本替换模式: 宏是一种抽象概念(Abstraction),它根据一些列预定义的规则替换一定的文本模式,而解释或编译器在遇到宏时会自动进行这一模式替换.类似地,zabbix基于宏 ...

  3. redis4.0.1集群安装部署

    安装环境 序号 项目 值 1 OS版本 Red Hat Enterprise Linux Server release 7.1 (Maipo) 2 内核版本 3.10.0-229.el7.x86_64 ...

  4. U盘操作

    一.8G的U盘被设置为2G,如何恢复 1.下载usboot 1.7 打开以后,选中U盘,点击[点击此处选择工作模式],选择[用0重置参数] ,然后点[开始].2.完成后它会提示拔下U盘,此时拔下U盘, ...

  5. Day2-Python基础2---字符串操作

    一.字符串操作 特性:不可修改 name = "my \tname is {name} and i am {year} old" #首字母大写.capitalize print(n ...

  6. canvas绘制简单图形

    canvas绘图篇: canvas绘制矩形: <!DOCTYPE html> <html> <head lang="en"> <meta ...

  7. Oracle OCP提纲

    ocp提纲 Oracle SQL 基础 ◆ 标准SQL语言介绍◆ Oracle数据库数据组织形式◆ DDL语句创建表及修改表结构◆ Select语句检索和限制表中数据◆ 从多表中检索数据(连接查询)◆ ...

  8. Log4j 记录error 日志

    第一个bug的起始,是在线上日志发现一个频繁打印的异常——java.lang.ArrayIndexOutOfBoundsException.但是却没有堆栈,只有一行一行的ArrayIndexOutOf ...

  9. 如何利用MATLAB并行计算缩短程序运行时间

    本来CPU就是双核,不过以前一直注重算法,没注意并行计算的问题.今天为了在8核的dell服务器上跑程序才专门看了一下.本身写的程序就很容易实现并行化,因为beamline之间并没有考虑相互作用.等于可 ...

  10. elastic(8)版本控制

    转自: http://www.cnblogs.com/AK47Sonic/p/7563393.html elasticsearch 版本控制: 内部版本控制 外部版本控制 内部版本控制: 内部版本会检 ...