计算机组成原理学习笔记————定点运算,二进制的加减运算及指令

定点运算

计算机中的字由位组成,字又是用二进制表示,那么我们该如何进行二进制的加减乘除运算呢?要搞清这个问题,首先得知道计算机中实数和浮点数的表示方法,定点表示和浮点表示等,详情见我专栏中另一篇博文。

弄清楚了数在计算机中的表示方法之后,我们先来看一下移位运算。

移位运算

移位就是将一个数中每个位上的数向左或向右移动。十进制中比如15左移一位变成150,右移一位变成1.5 。 因此十进制中数相对于小数点左移n位时相当于乘以10n ,右移n位则除于10n
计算机中小数点的位置是事先约定的,因此,二进制表示的机器数在相对于小数点移动n位时就相当于乘以或除以2n

在左移或右移n位,必然会使其n位低位或n位高位出现空位,那么,该对这些空位补0还是补1呢? 这与机器数采用有符号数还是无符号数有关。
对于无符号数,采用的逻辑一位,直接对空位补0,而对于有符号数的移位称为算术移位,要根据符号和表示方式而定

算术移位规则

下图给出三种不同码制的数,分别对应正整数和负整数移位后的添补规则。
在这里插入图片描述
无论是正数还是负数,移位后其符号位均不变。
从图中可以得出以下结论:

  1. 机器数为正时,不论是左移还是右移,添补代码均为0。

  2. 由于负数的原码数值部分与真值相同,故在移位时只要使符号位不变,其空位均添0
    即可。

  3. 由于负数的反码各位除符号位外与负数的原码正好相反,故移位后所添的代码应与原码
    相反,即全部添1。

  4. 分析任意**负数的补码可发现,当对其由低位向高位找到第一个“1”时,在此“1”左边的各
    位均与对应的反码相同,而在此“1"右边的各位(包括此“1”在内)均与对应的原码相同。**故负
    数的补码左移时,因空位出现在低位,则添补的代码与原码相同,即添0;右移时因空位出现在商
    位,则添补的代码应与反码相同,即添1。

  5. 对于整数,三种机器码移位后符号位均不变,左移时最高位数丢1,则结果出错;右移时最低为丢1,影响精度。

  6. 对于负数,三种机器数算术移位后符号位均不变。负数的原码左移时,高位丢1,结果出错,地位丢1,影响精度。负数的补码左移时,高位丢0,结果出错,右移时地位丢1,影响精度。负数的反码左移时,高位丢0,结果出错,右移时,地位丢0,影响精度。

加法和减法运算

加减法运算是计算机中最基本的运算。减法可以看成加法来计算,而乘除法也可以看成是累加累减的运算。
现代计算机中都采用补码做加减法运算

补码加减法的基本公式

加法基本公式:
在这里插入图片描述
n位机器数的字长即位数。
减法基本公式:
在这里插入图片描述
简单的讲就是将补码相加,减法就加-B的补码。结果再mod一下,通常情况下可以不用mod。
例题:
在这里插入图片描述
在求和运算的过程中就是**将数据从右到左逐位相加,同时进位也相应的向左传播,就跟我们手动进行加减法运算一样。**如图:
在这里插入图片描述

溢出判断

在计算机中,硬件的规模是有一定的限制的,机器的字长也是固定的,如字宽只有32位或64位。那么在进行加减法运算中,有可能计算结果的位数超过了限定的位数。当运算结果超出机器字长的现象溢出,因此必须得对结果进行溢出判断。
同号相减或异号相加时不会发生溢出,因为结果肯定小于其中一个数。同号相加和异号相减时可能发生溢出。

用符号位进行判断

知道溢出在加减法中何时不会发生固然重要,但如何检测它何时发生?很明显,加或者减两个32位的数可能产生需要用33位来表示的结果。
如果缺少了第33位,则溢出发生时,符号位就可能被数值位占用而产生错误。
因此,当两个正数相加但结果为负时,就说明发生了溢出,反之亦然。这个问题的和表示计算过程中发生了向符号位的进位操作。
在做减法时,如果用一个正数减去:一个负数得到一个负的结果,或者用一个负数减去一个正数然后得到一个正的结果,则发生了溢出。这也意味着借位占用了符号位。

操作操作数A操作数B表示结果溢出的条件
A+B>=0>=0<0
A+B<0<0>=0
A-B>=0<0<0
A-B<0>=0>=0

对于无符号数,因为无符号数通常表示地址,不会进行加减法运算,所以可以忽略

运算举例:
在这里插入图片描述
两操作数符号均为1,结果符号为0,故为溢出。

MIPS算术指令

加法(add) 立即数加法(addi) 和减法(sub) 这三条指令在溢出时产生异常
无符号加法(addu)、立即数无符号加法(addiu)和无符号减法(subu) 这三条指令在发生溢出时不会产生异常

补码加减法运算的控制流程

被加减数的补码在A中,加(减)数的补码在X中。
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值