计算机组成原理(二)——数据的表示和运算

1. 进位计数制

这部分主要是关于十进制、二进制、八进制及十六进制之间的相互转换与计算,老实说,这部分是学软件的基础知识,没啥难点,所以我就跳了这部分笔记。有疑惑的可以2倍速过一下视频:进位计数制

2. BCD码

BCD码:指用二进制编码的十进制数。

BCD码有三种,分别是8421码、余3码、2421码。

将二进制转换为十进制时,可以让每一个数码位乘与这个位的权值,再进行一个相加的操作,就可以转换成十进制。使用这种方式,将机器数转换为真值是比较麻烦的,所以使用BCD码来解决这个问题。

BCD码原理:使用4个二进制位(4个bit)来对应一个十进制位。因为4个二进制位可以表示16种状态,而这16种状态就足够用来表示十进制里0~9这十种状态,而且还会有6种冗余。

2.1 8421码

8421码是BCD码的一种编码方式,他将BCD码4个二进制位的权重分为8,4,2,1。

如果用8421码来表示真值8,对应的机器码就是1000。

如果用8421码来表示真值985,对应的机器码就是1001 1000 0101。

8421码的加法运算(以5+8为例):

  1. 如果采用手动计算,可以算出5+8=13,将13转换成机器码0001 0011即可。
  2. 如果是机算,应该是0101+1000=1101,得到的1101代表13已经超出8421码的编码范围,这时候要再加0110(加6)才可得到正确的机器码。

通过上述我们就可以知道,当按8421码编码的机器进行加法运算时,如果结果落在了1010~1111非合法区域内,需要对结果进行加6处理

计算机组成原理(二)——数据的表示与运算——8421码.png

2.2 余三码

余三码规则:8421码 + (0011)2

余三码就是在8421码的基础上进行加3处理。

但是8421码每一位都有固定的权值,所以像8421码这种有权值的码,称之为有权码;而余三码每一位没有固定的权值,所以像余三码这种没有固定权值的码,也被称为无权码。

计算机组成原理(二)——数据的表示与运算——余三码.png

2.3 2421码

2421码同8421码一样,但他将每个位的权值进行了改变,即权值按高到低依次是2,4,2,1。

例如,真值7按2421编码方式对应的机器码就是1101。

需要注意,因为2421码中间存在两位权值相等的情况,这就导致含权值2的真值数有两种编码方式,例如7可以对应1101,也可以对应0111。为了避免出现这种情况,2421码规定,真值小于5的数,最高位为0,真值大于等于5的数,最高位为1

计算机组成原理(二)——数据的表示与运算——2421码.png

3. 无符号整数的表示和运算

如果一个计算机机器字长是8位,这就意味着计算机只能同时处理8位运算,所以ALU的输入只能有8位。同时机器字长也限制了通用寄存器只能存8位。所以计算机硬件能支持的无符号整数位数是有上限的。

现在的计算机通常都是64位,至少也是32位。

3.1 无符号整数在8位计算机内部的表示

计算机组成原理(二)——数据的表示与运算——无符号整数的表示.png

3.2 无符号整数的运算

3.2.1 无符号整数的加法

计算机硬件做无符号整数的加法:从最低位开始,按位相加,并往更高位进位。

计算机组成原理(二)——数据的表示与运算——无符号数加法.png

3.2.2 无符号整数的减法

计算机硬件做无符号整数的减法:被减数不变,将减数全部位按位取反,末位+1,减法变加法;然后从最低未开始,按位相加,并往更高位进位。

将减法转变为加法的原因:加法电路造价便宜,减法电路造价昂贵。将减法变加法更省钱。

计算机组成原理(二)——数据的表示与运算——无符号数减法.png

3.3 无符号整数小结

计算机组成原理(二)——数据的表示与运算——无符号整数小结.png

4. 带符号整数的表示和运算

4.1 带符号整数在8位计算机内部的原码表示

计算机组成原理(二)——数据的表示与运算——原码表示.png

4.2 带符号整数在8位计算机内部的原码计算

如果按照无符号整数的加减运算法则,使用原码对带符号整数进行加减操作,我们会发现,结果会出现错误。

比如19+(-19),手算结果应为0。但是机器运算时会转换成二进制00010011+10010011,得到的结果是10100110,很明显结果并不正确,原因时,在带符号整数中,高位代表符号位,表示的不是数值信息,而是符号信息,这时候我们按照加法规则进行处理,就会出现错误。所以,我们可以发现原码的缺点。

原码的缺点:符号位不能参与运算,需要设计复杂的硬件电路才能处理,这样做很费钱!

所以,为了节约硬件设计电路的成本,人们发明了补码。

4.3 原码、反码、补码的转换

计算机组成原理(二)——数据的表示与运算——原反补的转换.png 计算机组成原理(二)——数据的表示与运算——原反补的快速转换.png

4.4 带符号整数在8位计算机内部的补码计算

4.4.1 带符号整数在8位计算机内部的补码加法计算

计算机组成原理(二)——数据的表示与运算——补码的加法.png

4.4.2 带符号整数在8位计算机内部的补码减法计算

计算机组成原理(二)——数据的表示与运算——补码的减法.png

通过了解带符号整数的补码减法运算,可以发现,他和无符号整数的减法运算步骤一样。这意味着,我们可以用同一套电路同时实现带符号整数的补码减法和无符号整数的减法运算,这大大节省了成本。

4.5 带符号整数运算小结

计算机组成原理(二)——数据的表示与运算——带符号整数小结.png

5. 移码

移码:在补码的基础上将符号位取反。

注意:移码只能用于表示整数,而且是有符号的整数。

移码的真值0只有一种表示形式,这一点和补码一样,但是两者的表示不一样:[0]移码=10000000;[0]补码=00000000

计算机组成原理(二)——数据的表示与运算——移码.png

6. 原反补移的转换及特性对比

计算机组成原理(二)——数据的表示与运算——原反补移转换.png 计算机组成原理(二)——数据的表示与运算——原反补移特性总结.png 计算机组成原理(二)——数据的表示与运算——原反补移表示.png

7. 定点小数

7.1 定点数

定点数分为定点整数和定点小数。其中定点整数的小数点位隐藏在最后,而定点小数的小数点位隐藏在符号位之后。

关于定点整数和定点小数的一些知识的补充(可看可不看,看了提不了分,不看也不影响考高分):

(1) 定点整数并不等同于整数。定点整数是计算机中数值数据的一种表示方法,它采用定点格式表示整数。定点数的小数点位置是固定不变的,即小数点固定在某一个位置,不再变动。与定点数相对的是浮点数,浮点数的小数点位置是浮动的。

定点整数虽然主要用来表示整数,但它实际上是定点数的一个子集,其小数点位置隐含在最低有效位的后面。因此,当我们说一个数是定点整数时,我们是在描述它的数值表示方式,即采用定点格式并且小数点位置固定。

然而,整数是一个更广泛的概念,在数学中,整数包括正整数、零和负整数。在计算机科学中,整数可以是带符号的或无符号的,可以是定点的或浮点的。所以,虽然定点整数可以用来表示整数,但整数不仅仅可以通过定点整数来表示。

综上所述,定点整数是整数在计算机中的一种特定表示方式,但不等同于整数本身。

(2) 定点整数并不一定就是带符号整数。定点整数在计算机中的表示是将小数点位置固定在数值的最右端,符号位右边的所有位表示整数的数值。它分为无符号的定点整数和有符号的定点整数两种。无符号定点整数没有符号位,其全部数位都用来表示数字,且小数点隐含在最低位后。而有符号的定点整数则是在无符号整数的基础上,在最左边加上符号位构成的。符号位用来表示整数的正负,0代表正数,1代表负数。

因此,定点整数可以是带符号的,也可以是不带符号的,具体取决于其应用场景和表示需求。

不过在本节里,我们把定点整数当成前面的带符号整数来运算可能会更容易帮助我们理解定点小数,毕竟我们本节所说的定点小数全是带符号的定点小数,带符号的定点小数也是考研大纲有关定点小数部分里最容易被考的。

(3) 定点小数不一定有符号位。定点小数在计算机中的表示方法是将小数点位置固定,通常用于表示纯小数。对于定点小数来说,其符号位的情况取决于具体的表示方法和应用需求。

在某些情况下,定点小数可能包含符号位,用于表示正数或负数。符号位通常位于最高位,用0表示正数,用1表示负数。这样,定点小数就可以表示正数和负数范围内的小数值。

然而,并非所有的定点小数都必须包含符号位。在某些特定的应用或算法中,可能只需要表示非负的小数值,此时定点小数可以不包含符号位,只使用剩余的位来表示数值部分。

因此,定点小数是否有符号位取决于具体的应用场景和需求。在设计和实现定点小数表示时,需要根据实际情况确定是否需要包含符号位,并相应地调整数值的表示范围和精度。

需要注意的是,即使定点小数包含符号位,其表示范围和精度仍然受到字长和小数点位置的限制。因此,在使用定点小数进行数值计算时,需要仔细考虑其表示范围和精度要求,以避免溢出或精度损失等问题。

(4) 对于8位定点小数,如果不带符号位,那么它全部8位都用来表示数值部分。在这种情况下,每一位可以是0或1,因此整个数值部分可以表示28个不同的值。

此时的取值范围:0~1 - 2-8

最小值:当所有位都是0时,表示的数值是0。

最大值:当所有位都是1时,表示的数值是 1 - 2-8

计算机组成原理(二)——数据的表示与运算——定点整数和定点小数.png

7.2 定点小数的表示及运算

7.2.1 定点小数的原反补转换

定点小数的原反补转换与定点整数的原反补转换规则是一样的。都可以参考这个图:

计算机组成原理(二)——数据的表示与运算——定点数原反补.png

7.2.2 定点小数的原码表示

定点小数的原码表示和定点整数规则一样,只是由于小数点移动到了符号位之后,所以每个位的位权发生了改变。

计算机组成原理(二)——数据的表示与运算——定点数原码表示.png

7.2.3 定点小数的加减运算

定点小数的加减运算和前面带符号整数的运算一样,都是转换成补码,然后对补码进行运算。

计算机组成原理(二)——数据的表示与运算——定点小数的运算.png

7.2.3.1 定点小数的补码加法运算

计算机组成原理(二)——数据的表示与运算——定点小数补码的加法运算.png

7.2.3.2 定点小数的补码减法运算

计算机组成原理(二)——数据的表示与运算——定点小数补码的减法运算.png

7.3 定点小数与定点整数的比较

计算机组成原理(二)——数据的表示与运算——定点小数与整数的比较.png

7.4 定点小数与定点整数的位扩展

定点小数的位扩展在数值位最后补0,而定点整数的位扩展是在符号位与数值位之间添0。

计算机组成原理(二)——数据的表示与运算——定点小数与整数的扩展.png

8. 奇偶校验码(计组大纲已删,但跑到计网里了,所以考408,逃不掉的)

二进制代码在计算机内部进行计算存取过程中,有可能因为元器件出现故障,或者由于某些环境噪音干扰,导致计算机内部二进制数据出现错误,所以必须考虑数据校验的问题。

8.1 校验原理简介

计算机组成原理(二)——数据的表示与运算——校验原理简介.png

如上图,假设用2bit映射4个合法状态,然后传输数据B即01,如果出现错误,1变0,则另一台主机接收到数据是00,代表A,这时数据发生了错误,但接收主机无法判断错误。

为了避免这种情况,可以将2bit扩展到3bit,此时映射状态有8种,但我们只取如图所示的4种,还有4种冗余的非法状态。此时发送B,如果1变0,则接收主机收到数据为000,显然000不在合法数据内,可知道数据出现错误,

8.2 奇偶校验

计算机组成原理(二)——数据的表示与运算——奇偶校验.png

奇校验:整个校验码中1的个数为奇数,这里的奇数是指有效信息位和校验位的1的个数加起来为奇数。例如上面的例2-3,1001101中1的个数为偶数,此时采用奇校验,需要里面有奇数个1,所以需要在校验位补1。

同理,偶校验:整个校验码中1的个数为偶数,这里的偶数是指有效信息位和校验位的1的个数加起来为偶数。例如上面的例2-3,1001101中1的个数为偶数,此时采用偶校验,需要里面有偶数个1,所以需要在校验位补0。

对于奇偶校验,如果出现奇数个位上的数据出现跳变(0变1或1变0),我们可以通过奇偶校验判断出数据出现错误,但如果偶数个位上的数据出现跳变,此时接收到数据进行判断时,扔满足规则,但数据却是错的。

例如:偶校验的数据01001101,在发送过程中,末位跳变成0,此时数据为01001100,接收方接收到数据发现不是偶数个1,会发现错误。但如果出现最后两个位跳变,变成01001110,此时接收方接收到数据发现是偶数个1,会默认正确,但实际数据是错误的。

所以,我们可以知道,奇偶校验仍是存在缺陷的。

不过以上的运算全是基于我们人类视角来看的,那计算机硬件是如何进行运算的呢?

这里以偶校验为例:

偶校验的硬件实现:各信息进行异或(模2加)运算,得到的结果即为偶校验位。

如上面的1001101,在硬件里,将7个bit位进行异或运算,得到结果为0,所以此时校验位补0,变成01001101。接受方接收到这组数据,将01001101中的8个bit位进行异或运算,得到结果为0,说明数据正确。

计算机组成原理(二)——数据的表示与运算——奇偶校验硬件实现.png

硬件的奇偶校验和我们前面发现的结论一样,如果偶数个位置跳变,是无法发现错误的!

9. 电路基本原理——门电路

这部分是有关电路非与门,串并行的电路知识介绍,有电路基础的可以直接跳过。

9.1 算术逻辑单元(ALU)

运算器内部除了包含一些寄存器外,还包含用于计算的核心部件——ALU(算术逻辑单元)。

ALU可以实现算术运算(加、减、乘、除等);还可以实现逻辑运算(与、或、非、异或等);还可以实现辅助功能(移位、求补等)

计算机组成原理(二)——数据的表示与运算——ALU.png

上图左边为抽象ALU表达图,有两个输入端,比如想实现两个8bit数的加法,其中一个数从A端进,另一个数从B端进,通过K区域控制信号,实现两个数相加运算,最后从F端输出。

上图右边为74181ALU芯片的结构图,从图可以看出,这个芯片是4位ALU,右边一列M~S3,是来自CU的控制信号,通过不同的组合,实现不同的运算规则。

74181下面是输入信号,表示可以输入两组4bit数据,这其实就是机器字长的真面目,机器字长指计算机能同时处理多少个bit整数的运算,也就是ALU可以同时输入多少个bit的数据。

需要注意的是,74181上还有一些我们没有说的输出输入口,而这些端口是为了用来与其他芯片进行串联而设计。这部分内容放在接下来的并行进位加法器中进行详细讲解。

9.2 基本逻辑——与或非电路

计算机组成原理(二)——数据的表示与运算——与或非.png 计算机组成原理(二)——数据的表示与运算——与或非补充.png

9.3 复合逻辑

计算机组成原理(二)——数据的表示与运算——复合逻辑.png

10. 加法器设计

10.1 一位全加器

一位全加器:用于将两个一位二进制数进行加法运算,并生成一个和值以及一个进位值。

计算机组成原理(二)——数据的表示与运算——一位全加器.png

上图左下角为一位全加器设计电路图,一位全加器主要有5个对外接口,分别是输入Ai、输入Bi、来自低位的进位Ci-1、本位的和Si、向高位的进位Ci

其中Si由于是本位的和,能影响到他的只有本位的两个二进制输入数据,以及来自低位的进位。所以Si的结果如上图右上角的公式,是Ai、Bi、Ci-1三者的异或。

注意,Si理论是三者相加,但这里使用异或,首先是因为我们设计的是加法器,而不是用加法器设计更复杂的电路。其次,这里的异或运算是对三个二进制数使用,根据进位规则,这里的异或运算就同等于加法运算(这么说有问题,但好理解)。最后,异或运算只需一个门电路即可完成,简单便宜。实际上,这里说了一堆道理都没用,记住就好。

除了Si,还有Ci,Ci是本位产生的进位。能产生进位的情况只有两种:第一,两个本位都为1,;第二,两个本位有一个为1,但是来自低位的进位是1。根据这两种情况可以写出上图中右上角的Ci公式。

10.2 串行加法器

串行加法器:就是在一个全加器的基础上,添加了一个进位触发器,每次产生的进位信号都存储到进位触发器,当进行下一组运算时,进位触发器在将存储的进位数据运送到低位进位处。如下图。

计算机组成原理(二)——数据的表示与运算——串行加法器.png

串行加法器运行一组n位的数据,就要执行n次,所以效率是很低的。

10.3 并行加法器

串行进位的并行加法器:把n个全加器串接起来,就可进行两个n位数的相加。

串行进位:每一级进位都依赖于前一级进位,即进位信号是逐级形成的。

计算机组成原理(二)——数据的表示与运算——串行进位的并行加法器.png

如上图所示,由于串行进位的并行加法器需要逐级进位,才能计算下一位的本位和和进位,所以运算速度很大程度上取决于进位的速度,那么这种方法可以进行优化吗?答案当然是可以的,接下来就来阐述一下,如何进位问题进行优化。

计算机组成原理(二)——数据的表示与运算——如何进位.png

根据上图列举规则,可以发现,每一位的进位其实可以由被加数、加数以及低位进行所表示,而低位进位可以由更低位进位推算,通过递归,到达最后一位不存在进位。当我们按照递归进行逆推,会发现每一组数据都可以写出来,这样我们就可以在下一位产生进位前,提前算出当前位有没有进位。通过这种手段,就可以实现各个位同时进行加法运算,大大提高了运算时间。

计算机组成原理(二)——数据的表示与运算——优化.png通过优化可以发现,每扩展一位,进行的运算就会复杂很多,所需设计的电路就越庞大,所以一般情况下,我们只设计到4位。

10.4 9~10两块小结

计算机组成原理(二)——数据的表示与运算——9~10小结.png

11. 补码加减运算器

11.1 知识回顾

11.1.1 加法器原理

计算机组成原理(二)——数据的表示与运算——加法器原理.png

11.1.2 补码加减运算

计算机组成原理(二)——数据的表示与运算——补码加减运算.png

11.2 补码加减运算电路

计算机组成原理(二)——数据的表示与运算——补码加减运算电路.png

上面便是补码加减运算电路,在加法器的基础上,添加了一个多路选择器。如果是加法,则Sub=0,Y端输入多少,多路选择器便输出多少。当Sub=1时,代表减法,此时Y端输入需要经过一个非门取反,进行加法时,还要加上来自Cin的1(这一连串操作其实就补码减法中的减数全部位取反末位加1)。

上图例1里有个重要知识点,不知道的话可能理解不了例子,就是X=-8,X=1000。这里可能很多人理解不了,是因为这里采用补码表示,他的原码真值0有两种表示,但补码只有一种,而多出来的一种被放到负数的最后一位,拓展了一位负数,所以这里-8补码的表示为1000,如果是原码是表示不了-8的,原码的表示范围只能是-7~7,说到这里其实我们还可以扒出一些别的知识点,既然我们看出来了是用补码表示的-8,说明他是一个带符号整数,且最高位是符号位,那他的数值位就只有3位,所以我们可以将其理解为一个带符号的8进制数。

在前面有提过,补码的加减电路其实和无符号数的运算电路是一样的(这个是知识点,要牢记的!),所以对于补码加减运算电路,我们也可以用其来说无符号整数的运算,如下。

计算机组成原理(二)——数据的表示与运算——无符号整数加减运算电路.png

12. 加减运算和溢出判断

12.1 加减运算

12.1.1 原码加法运算

计算机组成原理(二)——数据的表示与运算——原码加减运算.png

12.1.2 补码的加减运算

计算机组成原理(二)——数据的表示与运算——补码的加减运算.png

12.2 溢出判断

溢出判断的方法有三种,分别是采用一位符号位、采用双符号位、采用一位符号位根据数值位的进位情况判断溢出。

12.2.1 采用一位符号位

一位符号位判断的核心思想:

正数+正数=负数,出现上溢(只有正数+正数才会有上溢)

负数+负数=正数,出现下溢(只有负数+负数才会有下溢)

计算机组成原理(二)——数据的表示与运算——第一种溢出判断.png

12.2.2 采用双符号位

双号为溢出判断的核心思想:假设两个符号位为S1S2

S1S2=00:结果为正数,无溢出。

S1S2=01:结果正溢出。

S1S2=10:结果复溢出。

S1S2=11:表示结果为负数,无溢出。

计算机组成原理(二)——数据的表示与运算——双符号位溢出判断.png

12.2.3 采用一位符号位根据数值位的进位情况做判断

计算机组成原理(二)——数据的表示与运算——第二种溢出判断.png

12.3 符号扩展

通过上面的了解,我们知道当一个数的表示超出表示范围,就会溢出,那么该如何处理这个问题呢?一个最容易想到的办法就是符号扩展。

计算机组成原理(二)——数据的表示与运算——扩展.png

在上图,通过观察可以发现,不论是定点小数还是定点整数,他们的正数都添0,而负数的原码也添0,反码都补1,而补码从右往左遇到的第一个1的左边和原码一样,右边和反码一样。所以我们可以总结一条规律,对于补码,从右往左遇到的第一个1的左边跟反码一样补1,而右边和原码一样添0。

12.4 小结

计算机组成原理(二)——数据的表示与运算——溢出小结.png

13. 标志位的生成

计算机组成原理(二)——数据的表示与运算——标志位.png 计算机组成原理(二)——数据的表示与运算——标志位信息.png

14. 定点数的移位运算

移位运算可以分为算数移位和逻辑移位以及循环移位。

14.1 算数移位

算术移位:是一种计算机科学中的运算方法,它涉及到二进制数的移位操作。算术移位的对象是有符号数,也称为有符号移位,移位过程中符号位保持不变。

算数移位,通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法。

14.1.1 原码的算数移位

原码的算数移位——符号位保持不变,仅对数值位进行移位。(以下基于二进制来讨论)

右移:高位补0,低位舍弃,右移相当于除2。但是右移过程中,被舍弃的位置如果是0,则无影响;如果是1,则会影响精度(0说明能除尽2,1说明除不尽,除不尽的部分相当于直接被舍弃了,所以右移出现精度丢失,会导致数据变小)。所以右移会出现丢失精度问题

左移:低位补0,高位舍弃,左移相当于乘2,但是是左移过程中,被舍弃的位置如果是0,则无影响;如果是1,则会出现严重误差(0说明高位无数据,丢了没影响。但是1说明高位有数据,此时左移,会导致数据溢出,所以丢弃高位会产生严重误差)。所以左移会出现严重误差问题

以上的左移和右移规则,对于定点整数和定点小数都适应。不仅仅包括原码的算术移位,接下来我们讨论的反码、补码的算数移位规则对于定点整数和定点小数也都适应。

14.1.2 反码的算数移位

计算机组成原理(二)——数据的表示与运算——反码的算数移位.png

14.1.3 补码的算数移位

计算机组成原理(二)——数据的表示与运算——补码的算数移位.png

14.2 逻辑移位

计算机组成原理(二)——数据的表示与运算——逻辑移位.png 计算机组成原理(二)——数据的表示与运算——逻辑移位应用.png

14.3 循环移位

计算机组成原理(二)——数据的表示与运算——循环移位.png

14.4 小结

计算机组成原理(二)——数据的表示与运算——移位小结.png

15.乘法运算

15.1 原码的乘法

手算乘法:手算二进制乘法和我们数学里的日常计算乘法一样。

计算机组成原理(二)——数据的表示与运算——原码乘法运算.png

当我们进行手算二进制乘法时可以发现3个核心问题,第一,我们需要区分数值正负;第二,结果的位数相较于乘数扩大一倍;第三,每次相乘的位积都要保存下来然后再统一相加。发现这三个核心问题以后,我们就可以发现,只要我们的计算机能处理这三种问题,那么机算乘法就已经得到了解决。

计算机组成原理(二)——数据的表示与运算——原码乘法硬件构成.png

上图是原码乘法的硬件构成,为了应对我们上面说的三个问题,所以我们设计出了如图所示的硬件构成,其中X里存放被乘数,MQ里存放乘数以及乘积的低位,ACC里存放乘积的高位,ALU进行运算。说到这里,已经出现不可理解的问题,那就是ACC和MQ里存放的乘积高位和乘积低位分别是什么意思。

很简单,在初始时,我们将ACC置0,MQ里存放乘数,在进行乘法过程中,每次都是MQ最低位与X进行相乘,注意,说的是相乘,实际上,机器是判断MQ最低位是1还是0,如果是1,则将X中数据加入ACC中,如果是0,则ACC保持不变。当MQ的最后一位运算结束以后,需要将ACC和MQ整体向右移,即舍弃MQ最低位,为下一次运算相乘的结果加入,做好位积相加准备。这样我们就可以解决上面所说的二、三问题。至于第一个问题,我们可以使用两个数的绝对值相加,最后使用异或运算判断符号位即可,具体过程可以参考下图。

计算机组成原理(二)——数据的表示与运算——原码乘法运算手算模拟.png

注意,这里我贴了一张计算例子图,是因为这一块乘法在运算器中的执行是一个动态过程,我不太好用几句话描述,再加上我这个地方看了4遍,了解的还算可以,所以贴了一个手算模拟计算的例题,方便我快速回忆。有问题的可以连接跳转,去看一遍视频。原码的乘法运算

15.2 补码的乘法运算

补码的乘法与原码的乘法大体上一致,但补码的乘法需要在MQ的最后面补一位作为辅助位,使用该辅助位来判断该加上什么数。

计算机组成原理(二)——数据的表示与运算——补码乘法.png

下图,是补码的乘法运算的硬件构成,相比较于原码,在MQ的最后一位,添加了一个辅助位。一般在寄存器内,各个算术硬件的长度都相等,所以ACC和X也相应的扩展了一位,而这扩展的一位,便用来充当符号位,加上ACC和X的最高位原本就是符号位,所以补码运算里是双符号位的。

计算机组成原理(二)——数据的表示与运算——补码乘法运算器.png

具体的运算内容我便不详细叙述,因为他和原码运算一样。这里我贴张例子方便我自己回忆,大家可以去看看视频。补码乘法

计算机组成原理(二)——数据的表示与运算——补码乘法模拟.png

15.3 定点数乘法的小结

计算机组成原理(二)——数据的表示与运算——乘法小结.png

这里有一个易错的知识点,就是原码右移是逻辑右移,即符号位在计算过程中也要右移。而补码右移是算数右移,即符号位在计算过程中,是不会右移的。

16. 除法运算

16.1 原码的除法

原码的除法有两种方法,一种叫恢复余数法,一种叫加减交替法(不恢复余数法)。听名字就可以看出两种方法的区别产生在余数上,接下来,就对两种方法进行一个剖析。

16.1.1 恢复余数法

计算机组成原理(二)——数据的表示与运算——恢复余数法.png

除法硬件结构如上图右下角的结构图,与乘法运算的结构一样。

在进行原码除法运算时,在ACC中存放被除数以及余数、在X中存放除数,而MQ中则存放商。需要注意的是,除法运算的商放在MQ的最后一位,然后通过左移,来进行商的移位。这点与乘法不一样,乘法是右移实现的。

除法的运算原理:首先令MQ的最后一位为1,然后会执行ACC-X,结果为正,则说明被除数大于除数,商1是正确的,则MQ最后一位的商保持不变;如果结果为负,则说明被除数小于除数,商1是错误的,应该商0,此时,让ACC中余数加上X中的除数,恢复被除数,再令商为0(加红加粗的这段就是恢复余数的核心)。商完以后,令ACC和MQ整体左移,舍弃最高位,像上图左侧的竖式一样,此时ACC中剩下第一轮除商剩下的余数,MQ中得到商的第一位。然后再令MQ最后一位商1,如此循环,当MQ被商的结果填满以后,则停止运算。(注意,这里商的结果位数,应与乘商寄存器的最大位数一样。)

计算机组成原理(二)——数据的表示与运算——恢复余数模拟.png

上图是我们手动模拟机器计算的过层,需要注意的是,原码的除法运算左移的时候,是算数左移,连符号位也要左移,这一点和乘法运算一样,而且如果机器字长为n+1位(n为数值位,1为符号位),则要左移n次,商n+1次,这是因为最后一次商的余数,不需要进行左移操作。(注意是先商1,结果没问题再左移,结果为负责先恢复改商在左移,别颠倒商与左移两者顺序。)

经过上面的了解,我们可以发现,每次进行运算时,会有大量时间浪费在恢复余数上,有没有什么办法可以节省这段时间呢?答案是肯定的,这就是接下来说的加减交替法。

16.1.2 加减交替法

计算机组成原理(二)——数据的表示与运算——加减交替.png

我们可以对前面的恢复余数法进行深入研究,假设令余数为a,被除数为b。当除商以后的余数是负数,说明商1是有问题的,此时我们要加上余数,恢复原被除数,即a+b。这以后的操作便是商0,然后令被除数左移1位。在前面我们过,二进制左移即乘2,所以左移以后的被除数可以用(a+b)×2表示,这个时候按照规则,应加上被除数即2a+2b-b,这样才可得到下一个商的余数。所以,当出现商1不正确时,中间一系列的转换过程最后可以总结为一个式子2a+b,这个式子的意思就是若余数为负,则可直接商0,并让余数左移1位再加上除数的绝对值。

上述的理解,是我根据王道课程做的理解,我个人的感觉,王道每一组运算的结尾,是以商1做判断为结尾,即每一组的末尾都是加上[-|y|]补码。这样做的好处是,此时得到的余数如果是负,则可直接商0如果为正,则直接商1。但是不大好理解,所以我理解时,一般都把这段添[-|y|]补码放在一组运算的开头,先加上[-|y|]补码,表示商1做预测,结果为负,则回溯改0,不为负,则商就是1。所以,我的自己的思路是,到2a+2b就结束,即出现余数为负,在商0,让被除数左移1位,再开始进行新一轮商1判断。这里大家自己根据自己的喜好理解,当然有自己的理解更好。

接下里是原码加减交替法的手动模拟及思维导图,注意图中给的例子,最后若商的刚刚好,即余数为正数,则不需要回溯,如果为负数,则需要商0,并进行回溯得正确的余数

计算机组成原理(二)——数据的表示与运算——加减交替模拟.png 计算机组成原理(二)——数据的表示与运算——加减交替导图.png

16.2 补码的除法运算

计算机组成原理(二)——数据的表示与运算——补码除发加减交替.png

补码的除法运算与原码的加减交替变化并不大,但需要注意的是补码的最后一位为了缩减精度,指接商恒置为1,相较于原码来说简单了许多。

16.3 除法运算总结

计算机组成原理(二)——数据的表示与运算——除法运算总结.png

17. C语言类型转换

老实说,这节很基础,我感觉没啥好注释的…

计算机组成原理(二)——数据的表示与运算——C语言类型转换.png

18. 数据存储和排列

18.1 大小端模式

大端:一连串字节,与一连串地址,将高位字节存储在低位地址上,就是大端存储,这种存储方式方便人类阅读。

小端:一连串字节,与一连串地址,将低位字节存储在低位地址上,就是小端存储,这种存储方式方便机器阅读。

计算机组成原理(二)——数据的表示与运算——大小端方式.png

18.2 边界对齐

边界对齐和边界不对齐是两种不同的数据存储方式,它们各自具有特定的优缺点。

边界对齐,也称为内存对齐,是处理器为了提高处理性能而对存取数据的起始地址所提出的一种要求。这种方式的主要优点在于它可以提高访存速度。当数据按照边界对齐的方式存储时,处理器可以更有效地访问这些数据,因为它们位于预期的地址边界上。这减少了处理器需要进行的额外计算和操作,从而提高了数据处理的速度和效率。此外,边界对齐也有助于减少缓存未命中的次数,进一步提高系统性能。

然而,边界对齐的缺点在于它可能牺牲主存空间。在某些情况下,为了满足对齐要求,可能需要在数据之间插入填充字节,这会导致存储空间的浪费。特别是在存储小量数据时,这种浪费可能更加明显。

相比之下,边界不对齐的存储方式可以节省主存空间。由于没有强制性的对齐要求,数据可以紧密地存储在内存中,减少了填充字节的使用。这在存储大量小量数据时尤为有用,因为可以更有效地利用存储空间。

然而,边界不对齐的缺点在于它可能牺牲访存速度。当处理器尝试访问未对齐的数据时,它可能需要进行额外的计算和操作来找到正确的数据位置。这增加了处理器的负担,可能导致性能下降。此外,未对齐的访问还可能引发硬件异常或错误,需要额外的错误处理机制。

综上所述,边界对齐和边界不对齐两种存储方式各有其优缺点。在选择使用哪种方式时,需要根据具体的应用场景和需求进行权衡。在需要提高访存速度和数据处理效率的场景中,边界对齐可能是一个更好的选择;而在需要节省主存空间的场景中,边界不对齐可能更为合适。

计算机组成原理(二)——数据的表示与运算——边界对齐方式.png

19. 浮点数

19.1 浮点数的表示

计算机组成原理(二)——数据的表示与运算——浮点数的表示.png

浮点数在计算机里以阶码+尾数的形式存在,类比科学技术法a×10b,浮点数的真值表示形式为N=rE×M。这里阶码的真值对应公式里的E,尾数的真值对应M,其中数符与阶符分别是尾数与阶码的符号位。一般数据在计算机里都是以二进制形式进行运算,所以r一般取2。根据前面所学的乘法运算,可以发现,E的大小与正负,决定着乘2还是除2或乘2的几次方,除2的几次方,这些结果最后都可以归结为尾数部分的小数点左移或右移几位。

注意,阶码常为用补码或移码表示的定点整数,而尾数常为用原码或补码表示的定点小数。

这里我们可以参考上图中例子里的a的真值求取。

但是,当我们求b的真值时会发现,求出b的尾数为001001,如果用1B空间存储的话,会发现,前面3位用来存储了阶码,剩下5位存储尾数显然不够,最后一位1会被舍弃,这样会丢失精度,如下图。出现这种情况,我们仍可以类比科学计数法标准化思想(小数点前仅一位a,且0<a<10),这时我们会发现,假如我左移一位,将阶码减1,丢失高位0,将低位1移入存储空间,这样对精度就没有影响了。这种思想就是浮点数的左规思想。

计算机组成原理(二)——数据的表示与运算——浮点数规格化的引出.png

有了浮点数左规,那逆向思考一下,就很容易想到浮点数的右规。不论是浮点数的左规还是右规,统一都可以理解为浮点数的规格化。

但是,右规与左规不同,左规通常出现在浮点数运算结果尾数低位有精度缺失的情况;而右规通常出现在浮点数运算结果出现假溢出的情况。

如果尾数采用双符号位,且双符号为10或01,这个时候显然出现溢出,结果出现严重误差。这时候我们可以通过右规思想,将尾数算数右移一位,阶码加1,便可得到正确的结果。

当然当存储空间有限时,这样的操作可能会导致低位精度缺失,例如8bit存储空间里,尾数存储位有6bit,且为01,1001,右移以后就变成了00,1100。虽然精度有所缺失,但显然要比出现重大误差要好,具体的可以参考下图的例子。

注意,采用双符号位进行溢出判断,可以挽救溢出,所以双符号位判断溢出也是最常用的一种方式。

计算机组成原理(二)——数据的表示与运算——浮点数规格化.png

通过以上的了解,我们就可以对规格化的浮点数的特点进行一个简短的总结概述,具体如下图。

计算机组成原理(二)——数据的表示与运算——浮点数规格化特点.png

需要注意的就是原码与补码进行规格化的时候,要保证最高位是有效数值位。这里可以发现,原码的最高数值位不论是正数还是负数,都是有效数值位1,而补码的正数最高位是有效数值1。但是补码的负数的最高数值位是0这个非有效数字,这是因为,最高有效数值位的有效数字是根据真值转换成原码来看的,补码为0,对应的原码的最高位就是1。当然这里理解不了也没事,可以直接记住规格化的补码尾数,符号位与最高数值位一定相反。

还有一点,如图左下角的浮点数规格化以后的范围,规格化以后的数据有一个表示范围,如果超出这个范围的最大绝对值称为正上溢(或负上溢)如果小于这个范围的最小绝对值,则称为正下溢(或负下溢),如果是正下溢(或负下溢)则当为机器0处理,如果是正上溢(或负上溢),则机器会报异常。不过考研大纲这部分已删,了解即可。

计算机组成原理(二)——数据的表示与运算——浮点数表示小结.png

19.2 浮点数标准——IEEE 754

浮点数由阶码和尾数两个部分组成,如果不能采用统一的规则,规定阶码占多少位,尾数占多少位,阶码和尾数采用原码、补码还是移码表示,那么在信息传输中就会出现错误。所以,为了避免这种情况,IEEE 754就应运而生。

在IEEE 754 标准中,阶码采用移码的方式进行表示,移码的基础部分我们在本章第5个知识点里说过,可以翻到前面看看。因为阶码都是整数,而移码恰好也只能表示整数,所以为了充分利用资源,采用移码表示浮点数的阶码。在了解具体的表示过程之前,我们需要先对移码进行一个深入拓展。

19.2.1 移码的拓展

移码,在前面的定义是补码的符号位取反,但其实,移码的本身定义确是如下的公式,移码=真值+偏置值

我们会先用二进制写出移码的真值,然后加上偏置值去求得移码。前面我们所说的符号取反,其实是偏置值取固定值的一种例子。

需要注意的是,通常移码的偏置值是一个非负整数。这是因为在移码的设计中,偏置值的主要目的是为了实现正数和负数的无符号表示,从而简化计算机的运算过程。

前面我们对移码的定义是对补码的符号位取反,其实就是加上了2n-1,其中n为移码的最大存储长度。例如,用8bit表示移码,真值-127的二进制形式是-1111111B,这个时候的偏置值就是28-1=128D=10000000B,所以-127的移码=-1111111B+10000000B=00000001B。(注意这里的无符号数与有符号数的运算,在计组这门课里没有讲,所以大家可以手算,当然考研的时候也不会出机算过长,只会让大家手算将浮点数转换成IEEE 754标准。)

当然,偏置值不是固定的,也可以是其他数,在我们的IEEE 754标准里,阶码就由移码表示,且移码的偏置值就等于2n-1-1。

例如下图里的-128真值=-10000000B,但是偏置值只有127D。这里因为是8位,所以可以看成mod28的运算(28=1 0000 0000),所以127-128=0111 1111+1 0000 0000-1000 0000=1111 1111。

计算机组成原理(二)——数据的表示与运算——移码拓展.png

19.2.2 IEEE754标准

计算机组成原理(二)——数据的表示与运算——IEEE754标准.png

IEEE754标准与正常的浮点数表示格式不一样,具体格式如上图(上图给出C语言里三中国浮点数的格式)。在这里需要注意几个重点,在IEEE754标准里,因为阶码用移码表示,而移位通过偏置值的转换,是正整数,所以,可省略移码的符号位(默认为正)。尾数部分使用原码表示,前面我们说过,浮点数的尾数需要进行规格化,而规格化以后的最高位必须是有效数字位,而使用原码表示,最高位必定为1,所以这里,我们可以把尾数的最高位省略(默认为1)。如上图,虽然在短浮点数里,尾数只有23位,但实际上有24位(最高位1省略)。转换公式在上图也给出(公式不是万能的,要理解掌握推导过程,学会具体问题具体分析)。

另外,阶码全1、全0的两种情况,是用作特殊用途,所以阶码的实际表示范围要忽略这两位。如上图短浮点数,阶码8位,表示范围时-128-127,但转换成移码就是1111 1111、0000 00001111 1110。其中1111 1111和0000 0000有特殊作用,所以阶码实际的表示范围是-126~127。

接下来举个例题

计算机组成原理(二)——数据的表示与运算——IEEE754标准例题.png

这个例题大家可以手算一下,很简单,我贴张图在这,方便自己下次看的时候回忆推导过程。

计算机组成原理(二)——数据的表示与运算——单精度浮点数绝对值.png

接下来,我们讨论一下,IEEE754标准下的浮点数的最大绝对值与最小绝对值的问题。这里我们以单精度浮点数为例,若绝对值最小,因为阶码表示2的次方项,所以阶码越小数值越小,而尾数也要取绝对值最小的数,因为在754标准下,尾数是省略1的,所以我们尾数的最小值是1.M(M=0),M代表尾数值。而最大绝对值就是阶码最大,尾数也是最大的,对应的就是阶码位1111 1110,尾数为1.M(M=1)。具体范围如上图。

上述表示范围里,绝对值最小的数是1.M(M=0)。那有没有更小的数呢?答案是有的,这就牵扯到阶码全0全1的情况。如果用无符号整数来看阶码,那阶码的表示范围应该是1~254(我们把全0和全1的情况舍掉了)。丢掉的0和255就是阶码全0和全1的情况。

如果阶码全为0,尾数M不全为0时,表示的就是非规格化的小数,在这里我们把小数点前隐藏的1默认为0,阶码的真值固定视为0。这时候表示的浮点数就是0.M。例如表示0.001×2-126,对应的就是E=0,M=0.001,数符=0。

如果阶码全为0,尾数M全为0时,表示的就是真值的绝对值为0的数。

如果阶码全为1,尾数M全为0时,表示的就是无穷大,至于正无穷大还是负无穷大要看符号位。

如果阶码全为1,尾数M不全为0时,则表示非数值。

计算机组成原理(二)——数据的表示与运算——阶码全0全1.png

19.2.3 知识回顾

计算机组成原理(二)——数据的表示与运算——知识回顾.png

19.3 浮点数运算

19.3.1 浮点数的加减运算

计算机组成原理(二)——数据的表示与运算——浮点数加减运算.png

浮点数的加减运算分为五步:

  1. 对阶。将两个浮点数的阶数进行对阶操作。一般情况下,我们用小阶去对大阶。这样小阶对应的尾数只需右移即可。如果用大阶对小阶,可能出现大阶左移,导致小数点前有效位不只1位。例如1.2×210与1.3×213。我们会选择将1.2×210转换成0.0012×213,来进行对阶操作。
  2. 尾数加减。将对阶以后的浮点数的尾数进行加减操作。
  3. 规格化。加减以后可能出现小数点前有效位不只1位,或无有效位的情况,这个时候需要进行规格化处理。
  4. 舍入。舍入一般用来保留位数,具体的舍入有两种情况,我们再后面进行细说。
  5. 判溢出。最后一步需要对阶码进行一个判断,如果阶码超出存储最大值,这个时候说明数据存在溢出。

接下来我们以一个例子演示上面的步骤:

计算机组成原理(二)——数据的表示与运算——浮点数加减运算例子.png

上面是浮点数加减运算的例子,注意题目给的是按机器补码浮点运算规则计算,所以运算过程中采用的都是补码,可以手动跟着算一遍,按照步骤算一遍就全都明白了。需要小心的是,我们在上面的例子里可以看到在尾数加减以后,算得的符号位为10,说明数据发生溢出,但这个溢出是可以挽回的,记得我们在19.1里说过(忘了可以回去看一下),双符号位可以用来拯救溢出。所以这里进行右移操作,将数据规格化处理。

右移时,最低位被舍入,但这里被移除的是0,所以对数据没有影响。但如果移除的是1,那对精度就有影响力,接下来,我们就对舍入进行一个讲解。

舍入有两种方法:

​ 第一种:0舍1入:如果移除位是0,则直接舍弃即可。如果是1就在尾数剩下的位置上进行加1操作。

​ 第二种:恒置1法:不论右移时丢弃的数值位是1还是0,都在右移后的位数末尾恒置1。

具体的可以参考下面的图。

计算机组成原理(二)——数据的表示与运算——舍入.png

这里有一种情况,有些计算机为了保证数据在运算过程中的精确度,可能会把尾数的数据拿出去放到一个更大的内存空间里进行操作,操作以后原尾数长度再拼回浮点数。

19.3.2 强制转化

强制转换在c语言里我们都有学过,所以这里简单提一下。以float类型为例,在32位机器里,float类型以IEEE754标准存储,即1位数符位,8位阶码,23位数据(实际24位,最高位1隐藏)。而int型是1位符号位,31位数据位。虽然float数据位少,但float表示数据范围大,所以int向float转化不会存在溢出,但int数据位多,所以会丢失精度。而float向int类型转换就有可能溢出,另外float型如果表示0.00001这样的小数,向int型转换时,int会截取小数点前的位置,表示0,f所以loat转int也可能会产生精度损失(这里大家都学过c语言,float转int会丢失精度大家写过代码都清楚,所以结合写代码的经历理解)。

19.3.3 浮点数运算小结

计算机组成原理(二)——数据的表示与运算——浮点数运算小结.png