挑战408——组成原理——定点数及其加减运算

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/redRnt/article/details/83275569

定点数

定点数:小数点固定在某一个位置的数,有纯小数和纯整数之分。
假设数据用原码表示,那么:
纯小数可以表示为
在这里插入图片描述
对于纯整数,可以表示为:
在这里插入图片描述
对比前面两幅图,只是小数点的位置不一样而已,在末尾表示整数,在内部表示小数。那么为什么表示整数的时候我们要减去一个1呢?我们回想一下原码的表示范围就会发现,原来是原码中0可以有两种不同的表示方式,因此减去一个重复的0.

缺陷:对于定点数而言,由于其小数点位置不变,因此当处理非纯小数的时候,我们时刻需要乘上一个比例因子,以防止溢出。那么要是小数点可以移动那就好办了,这种数我们称为浮点数。很快会讲。

定点数的运算

定点数的运算主要包括,移位,加,减,乘,除运算。其中移位运算是基础,加减运算是重点,乘除运算过程繁杂,不大可能在考试中出现。

移位运算

计算机中的定点数的小数点位置都是事先约定好的,所以二进制的小数点移动相当于乘上或者除以2的指数。就很像我们十进制中的移位:
15 -> 150 //小数点右移一位 相当于乘10
15 ->1.5 //小数点左移一位,相当于除10
那么类比到二进制来说,就是乘上或者除以2^n。
对于有符号数的移位,我们称为算术移位,移位运算也称移位操作。操作的规则如下:

  • 无论是正数还是负数,移位前后符号位不变
  • 真值为正的时候,左右移动均添0
  • 若真值为负,那么分下面三种情况:
    • 原码添0
    • 补码左移添0,右移添1
    • 反码添1

下面举个例子说明一下(假设机器字长为8位):
在这里插入图片描述
上面举的是原码的左移例子,并且真值为正。那么我们看看补码的例子,且真值为负。
在这里插入图片描述

移位可能带来的问题

  1. 对于正数而言:左移的时候最高位可能丢1,即把1移出去了,造成溢出。反之,右移有可能把最低位的1移出去,影响数据的精度。
  2. 对于负数而言:原码与上述情况一致,因为都是添0,而反码的左移添加的是1,右移也是如此,因此均会造成0的丢失影响精度。对于补码来说做移高位丢0,右移丢1,精度都不对。

加/减运算

计算机中,加法减法的运算是最基本的运算,其中我们平时的计算中也可以知道的是,减法可以当做加法进行运算。比如:
A - B = A +(-B);
由于我们前面说过,引入补码的原因就是为了方便计算,所以我们都采用补码来进行运算的。

基本公式(或者说理论基础):
[A]补_+ [B] 补= [A + B]补
[A]补 - [B]补 = [A]补 + [-B]补

其中 [-B]补 称为求补后的减数,由[B]补,连同符号位在内,每位取反,末位加1所得

下面看两道计算题:
(1)已知X = +1001 ,Y = -0101,求【X+Y】补,以及X+Y。
在这里插入图片描述

这里,我们可以明显的看到,在使用补码的运算中,符号位参与了编码并且一起参与了运算。因为符号位只有一位所以舍弃最高的一位。

(2)已知某机器字长为8位(含一位符号位),令A = 15,B =24, 求【A+B】补 和(A-B)。
在这里插入图片描述

溢出判断

考虑这样一个问题,机器字长仍为8位,其中A = -93,B = 45.按照计算规则,我们有:
在这里插入图片描述
很明显我们的计算过程是没有任何的问题的,但是问题出在我们把符号位参与了运算,我们根据常识知道结果为 -138 而138显然大于2^7 = 128.所以7位数值位不足以容纳超过128(不用减一因为补码表示的0唯一)的数。这种计算结果超过机器字长的现象我们称为溢出

因此,我们要对溢出进行严格的控制。常用的判断溢出方式有:

  1. 肉眼观察法(做题好用)
    这种往往看似很蠢的方式,却是最直观也是最有效的方法。就是通过对计算结果的大致估计来判断是否发生溢出。就比如上题,我们显然可以直接算出 -93-45 = -138,显然会发生溢出。对于一些判断溢出的方式往往这种方式最有效。
  2. 一位符号位判断溢出(计算机中判断方式之一)
    我们先看看溢出的必要条件是什么,同号相加,异号相减才有可能发生溢出。因此无论是做加法还是减法,只要实际参与操作的两个数(减法为【-B】补),符号相同,结果又与原操作数符号不同,即可以说明发生了溢出
    看下面一道例题:
    设某机器字长为4位(含一位符号位)
    当A = 5,B = 4时,有:
    在这里插入图片描述
    当A = -5,B = -4时,有:
    在这里插入图片描述
    这个时候产生了两个符号位,我们舍去最高的符号位,剩下0为符号位。
  3. 两位符号位判断溢出
    两位符号位的补码,也称变形补码。即在原符号位的前面加多一位符号位,这个加上去的符号跟之前的符号位一样
    比如:
    【X】补 = -0.1011 加多一位符号位变为 11.1011
    【X】补 = 0.1011 加多一位符号位变为 00.1011
    原理:当结果的2位符号位不同时(即01或者10),表示溢出,且高位(就是第一位)的符号位永远代表着真正的符号。
    举个例题:
    在这里插入图片描述
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/redRnt/article/details/83275569