其他分享
首页 > 其他分享> > 《深入理解计算机系统》第二章:整数的运算

《深入理解计算机系统》第二章:整数的运算

作者:互联网

《深入理解计算机系统》第二章:整数的运算

文章目录


前言

我将在本篇文章,详细回顾一下整数的运算


一、加法运算

1.1 无符号加法

先来看一个溢出的例子:
在这里插入图片描述
上边的例子,255+1,本应该等于256,但是256超出了unsigned short的表示范围,所以发生了溢出。下面看一下无符号数加法的公式:
下面定义了一个表示w位的无符号数。
在这里插入图片描述
下面我们用bit位加法重点看一下溢出的情况:
在这里插入图片描述
我们可以通过uadd_ok函数来实现对无符号加法是否溢出的判断,函数的数学证明如右侧所示:
在这里插入图片描述

1.2 有符号加法

我们定义了一个表示w位的有符号数:
在这里插入图片描述
无符号的加法只有正溢出一种情况,而有符号数的加法则有正溢出和负溢出两种情况。有符号加法的计算公式如下:
在这里插入图片描述

1.3 加法溢出

正溢出:
在这里插入图片描述
在这里插入图片描述
如何判断有符号数是否发生溢出现象:
1、两个正数相加得到一个负数,则说明发生了正溢出
2、两个负数相加得到一个正数,则说明发生了负溢出
在这里插入图片描述
在这里插入图片描述

1.4 CSAPP加法逆元

CASPP原书中引入了加法逆元的概念。
无符号数的加法逆元表示公式如下:
在这里插入图片描述
有符号数的加法逆元如下:
需要注意的是,当X取TMin的时候,采用负溢出的方法来表示逆元。
在这里插入图片描述

二、乘除运算

2.1 截断

在这里插入图片描述
然而当定义z为w位时,2w位会超过w位数字的表示范围,会发生截断,留下低w位:
在这里插入图片描述

有符号数的乘法比无符号数的乘法多了一步,就是将乘法运算的结果最后转成补码。
在这里插入图片描述

2.2 三位数乘法

在这里插入图片描述
我们通过上图发现,上下相邻两位,虽然数值不一样,但是截断之后的结果是一样的。具体推导公式如下:
在这里插入图片描述

2.3 乘除法的优化

假如做一次移位操作需要一个时钟周期,则乘法运算会需要11-13个时钟周期,虽然说现在硬件做了优化,但是还是需要三个时钟周期,即使这样也是比移位运算要慢很多,所以在计算机的运算中,乘除法实际上使用的是移位、加法以及减法的方法进行运算的
乘法操作转换成左移,下图看一下移位运算符:
在这里插入图片描述
下面给出数学证明:
在这里插入图片描述
下面看一个乘法优化的例子:
在这里插入图片描述
看完乘法的例子,我们再来看一下除法:
在这里插入图片描述
右移运算:对于无符号数的右移操作采用逻辑右移;对于有符号数的操作采用算数右移,算数移位操作和逻辑移位操作的区别在于,有符号数的算数右移运算要考虑符号位,如下图所示:
在这里插入图片描述
除法操作中遇到除不尽的情况,选择向零舍入
在这里插入图片描述
为了保证除法操作向零摄入,对于有符号数的除法操作:
当X < 0时,让X += 2^k - 1,然后再进行右移
在这里插入图片描述


总结

整数的运算中,加减法是常规操作,但是乘除法里面,因为计算机做乘除法需要消耗十几个时钟周期,效率远远小于做移位运算和加减法,所以在计算机中,乘除法的运算会被分解成移位以及加减法。

标签:计算机系统,运算,符号,乘除,加法,第二章,溢出,乘法
来源: https://blog.csdn.net/qq_34037358/article/details/113665569