《深入理解计算机系统》第二章:整数的运算
作者:互联网
《深入理解计算机系统》第二章:整数的运算
文章目录
前言
我将在本篇文章,详细回顾一下整数的运算
一、加法运算
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