计算机组成原理-第二章(6)定点数

计算机组成原理

此系列为王道计算机考研组成原理精细笔记


1 各种码的作用

  首先是计算机对原码进行加减运算的时候必须考虑到符号位。如两个8bit二进制数:0000 1110和1000 1110进行相加,如果我们不考虑符号位结果就是1001 1100,但真实的结果应该是0。
在这里插入图片描述
  而且在使用原码运算的时候,需要用到加法器和减法器,加法器的硬件电路较容易设计,减法的硬件电路就比较难设计,所以要用硬件实现加法和减法的电路设计就会使成本增加,同时复杂度也增加。所以有人就想到了是否可以用加法代替减法?

  我们试想一下,一面钟,如果我们想到从十点指针指到七点,我们有两种方法,一是我们可以将时针往左拨3个位置,或者往右波9个位置。本来10+9是等于19的,但是时钟盘面只有12个,所以我们最后时钟的指向是要用19对12取余,得到的余数是7。
在这里插入图片描述
  在数论中,我们将这种取余的操作称为模运算,就是19 mod 12 = 7,这个例子是说,-3和9在模12的情况下是等价的。所以,在这种情况下,我们就能用加法运算器代替减法了。

  由于-3和9在模12的情况下,它们等价,另外它们两个的绝对值相加等于12,所以我们将它们称为互为补数。一对模数,它们的绝对值之和要等于它们的模。
在这里插入图片描述

  • 模12就是相当于将所有的整数全部映射到0-11这个范围。
  • 那么模2的8次方就是相当于0-2的8次方减1这个范围。

  回到刚才那个例子:
在这里插入图片描述
  我们已经确定了模是28,那么要确定-14的补数,我们可以用模-|14|就能得到补数即为:1 0000 0000 - 0000 1110可以得到值为:1111 0010,最后我们需要将正14加上-14的补数即为:0000 1110 + 1111 0010 = 1 0000 0000,又我们规定的机器字长是8bit,所以高位的1去掉即为:0000 0000。

这里也要说明一下:上一节所说的补码其实就是我们这里求的补数,所以,补码可以让减法操作转变为加法操作。

在这里插入图片描述
  我们再看一个实例:
在这里插入图片描述

2 定点数的表示和运算

在这里插入图片描述

2.1 算数移位

  我们先来讲移位运算

  我们以一个例子进行说明:如我们有一个十进制数985.211,我们将这个数的小数点往后移n位其结果等于985.211 * 10n,如移两位得到的数就是98521.1,往前移的话就是除以10的n次方。如果我们结合r进制的定义来看的话,其实移动小数点的位置就相当于改变了每个数码位的位权。所以,移位就是通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。
在这里插入图片描述
  上述我们说的是十进制,现在我们来看原码对定点整数的移位,和十进制大同小异,我们拿到一个二进制的原码,我们将其右移1位就相当于除以2的1次方,左移1位就相当于乘以2的1次方,定点小数也一样。
在这里插入图片描述
  对于反码的话,反码的算术移位,正数的话和原码一样,负数的话就是,补位的时候,高位,低位都是补1。
在这里插入图片描述
  而对于补码的移位而言,其正数也和原码的操作一样,但是负数的话就要复杂一点:最右边的1和所有右边的位数和原码保持一致,左边的和反码保持一致。且右移的时候,高位补1,低位舍弃,左移的时候,低位补0,高位舍弃。
在这里插入图片描述
总结
在这里插入图片描述
在这里插入图片描述

  • 逻辑移位:
    逻辑右移:高位补0,低位舍弃。
    逻辑左移:低位补0,高位舍弃。
    在这里插入图片描述

2.1.1逻辑移位的作用

在这里插入图片描述

2.1.2 循环移位

  循环移位:当我们左移的时候移除来的1位,会放到低位需要填补的地方,移位的时候整个二进制串是进行循环补位的,右移也一样。

  还有一种带进位位的循环左移:比如左移,我们会将二进制数值位的最高位放到进位里,进位里的数值移到低位。右移也一样。
在这里插入图片描述

3 定点数的运算和溢出判断

在这里插入图片描述

3.1 原码的加减

在这里插入图片描述
  原码的加法,逻辑比较复杂用硬件电路实现太难了。所以计算机中通常使用补码进行加减的。

3.2 补码的加减

在这里插入图片描述
  这里我们有A=+1111是十进制的15,B=-11000为十进制的-24,我们怎么求A+B的补码呢?

  首先,我们要知道正数的补码和原码是一致的所以,A补=0,0001111,负数的补码是将原码取反然后位数+1,所以B=1,1101000,相加得到1,1110111转化为原码:1,0001001,补码的减法可以看做A+(-B)

现在,我们再看一个例题:
在这里插入图片描述
  我们发现15+124=-117,而实际上应该是139,这种情况我们称为溢出,因为我们使用的是8bit的,139超过了8bit表示的范围,所以溢出。
  既然出现这种问题,我们的计算机就需要有一个溢出判断。
  当我们处理补码的加法和减法问题时都可以转换成加法问题,所以我们只要考虑如何处理加法问题即可。
  这里我们要知道只有两个符号相同的数相加才会发生溢出,且两个正数相加发生上溢,负数则为下溢。
在这里插入图片描述

基于上述,计算机如何处理溢出呢?
下图,AS,BS,SS表示的是逻辑值的真和假或者0和1
在这里插入图片描述
在这里插入图片描述
方法三:这里采用的双符号位,如下图:第一个符号位为本来应该得到的正确的一个正负性,而第二个代表实际得到的正负的结果,[A+C]补中,本应得到正的却得到负的就是上溢,[B-C]补中,本应得到负的却得到正的就是下溢。
在这里插入图片描述
产生溢出的原因是我们给定的机器字长不够表示这么大的范围,那怎么才能让原码和补码表示更大的数,从而避免溢出的发生呢?
一个最简单的办法就是,将短数据扩展为长数据

  值得注意的是负整数进行填补时,负整数的原码是在原符号位和数值位中间填0,反码则是填1,补码则是从右往左数到底一个1,这个1的右半部分和原码保持一致,左半部分和反码保持一致。负的小数也一样。

在这里插入图片描述

3.3 原码的乘法运算

在这里插入图片描述
  如下图,是我们熟知的十进制小数和小数之间的乘法运算,我们本能的对它们进行错位的写在一起呢?这可以结合我们之前介绍的r进制:
在这里插入图片描述
  我们也可以采用与十进制一样的方法计算二进制的乘法:

  且二进制使用计算机进行操作时更加方便,比如对于下图的(1101) * 1 * 2-5时,可以对其右移五位即可,(左移为乘,右移为除)
在这里插入图片描述
  但是实际使用机器进行实现时,还有以下问题:
在这里插入图片描述

所以就引出了原码一位乘法,如题:
在这里插入图片描述
这里需要我们求x * y,首先我们回顾一下运算器中的乘法操作:
在这里插入图片描述
我们能够发现,运算器进行乘法运算的时候,ACC存的是乘积高位,MQ存放的是乘数、乘积低位,通用寄存器X存放的是被乘数。x * y中,被乘数就是x绝对值的原码即01101,MQ里面存放乘数即y绝对值的原码也就是01011
在这里插入图片描述
我们从乘数的最低位和被乘数位积,且当乘数当前最低位为1时,使ACC加上被乘数,为0则ACC加上0, 这个过程由加法电路ALU完成,相加结果放到ACC里面,手算时,我们计算时需要错位,计算机则是用ACC和MQ里面的数据统一右移一位(逻辑右移高位补零),且被移除的最低位直接丢弃,然后重复进行操作就能得到结果。
得到结果后我们还要处理符号位,即x和y的符号位异或操作得到,这里x的符号位是1,y的是0,所以最后符号位是1。
在这里插入图片描述

异或操作:相同为0,不同为1,0代表正,1代表负

手算:
在这里插入图片描述

3.4 补码的乘法运算

在这里插入图片描述
补码的一位乘法和原码的相比:
在这里插入图片描述

补码乘法运算硬件构成和原码有什么不一样?
  首先是辅助位,就是把MQ寄存器多扩展了一位,用新扩展的一位来存储的,初始为0,每次右移会使MQ的最低位顶替原本的辅助位(事实上MQ共n+2位),其次,所有寄存器都统一用n+2位,因此采用双符号位补码运算。
在这里插入图片描述

手算:

  首先使高位初始化为0,低位为初始乘数+补0(辅助位),然后用辅助位-乘数最低位得到1或0或-1时进行相应运算,重复执行,且运算完之后,还要在最后进行一次加法。
在这里插入图片描述
算术右移:符号位保持不动,算术位新出现的空位用和符号位相同的数来填补

总结

  下一节是各种码的作用和定点数的表示和运算,期待大家和我交流,留言或者私信,一起学习,一起进步!

在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写Bug那些事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值