整数运算

来源:互联网 发布:ansible windows模块 编辑:程序博客网 时间:2024/06/06 12:58

计算机计算的有限性导致了计算机表示的数据不能无限大,无限小。这节主要讨论了整数运算的溢出问题。

1.无符号加法

无符号加法是一种模数加法,即无符号加法产生的结果是对真正的结果进行取模得到的,具体要模的数字要视该数据类型所能表示的最大数字而定。

模数加法形成的这一数据结构被称为阿贝尔群。

这里写图片描述

2.补码加法

补码加法即有符号数加法。两个数的w位补码之和与无符号之和有完全相同的位级表示,大多数计算机都使用同样的机器指令来执行无符号或者有符号加法,但是因为对位级的不同解释导致了补码加法和无符号加法结果的不同。

补码加法最终会产生三种结果:正常范围,正溢出,负溢出。如下图所示:

这里写图片描述

1.当运算结果超出补码可表示的最大正数时,发生正溢出。正溢出会导致运算结果为负数,这是因为,在未发生正溢出时,补码表示正数的符号位为0,发生正溢出时,会使原来的符号位产生进位,符号位由0变为1。
2.运算结果处于正常范围。
3.当运算结果超出补码可以表示的最小负数时,发生负溢出。负溢出会导致运算结果为正数,这是因为在未发生负溢出时,补码表示负数的符号位为1,发生负溢出时,会使原来的符号位产生借位,符号位由1变为0。

值得注意的是:

从上图中看,发生正溢出时结果会变成负数,当正溢出到一定地步,会导致正溢出所形成的负数变得足够小,以至于超出负数的表示范围,发生负溢出,而负溢出又会使结果成为正数。

这样从某种角度来看,补码运算的结果也是在一个范围内循环。

总结:计算机执行的整数运算实际上是一种模运算形式,补码表示提供了一种既能表示负数也能表示正数的灵活方式,同时使用了与执行无符号算术相同的位级表示。