考研408《计算机组成原理》复习笔记,第二章(3)数值数据的运算和存储(定点数计算)
知识点大纲回顾
前面我已经完成了 “ 数据表示 ” 的【定点数表示】和【浮点数表示】,那么还剩【数据存储】和【数据运算】这两块内容
;
其中没看过前几篇的可以看这几篇回顾一下:
- 【定点数表示】:考研408《计算机组成原理》复习笔记,第二章(1)数值数据的表示(定点数篇)_数值数据的表示方法-CSDN博客
- 【浮点数表示】:考研408《计算机组成原理》复习笔记,第二章(2)数值数据的表示(浮点数篇)-CSDN博客
一、数据的存储的基础概念(要了解,但408不重点考)
如果一个数据刚好就够一个存储单元装下,那么我们只需要关心他的【数据地址】来找到这个数据就行了
那么如果一个数据一个存储单元装不下,那么就要拆分成多块放到多个存储单元,这就涉及到【字节顺序】和【内存对齐】
1、字节顺序
【大端序】
【小端序】
考研考点:知道明确的【主存地址】和【在主存存放的形式】,来看到底是【大端序】?还剩【小端序】?没什么好说的,看一下顺序就行了,大端序就是正常顺序,小端序就是反着的顺序
2、内存对齐
简单人话:机器读主存或外存的时候使用N根线合起来的一根【数据总线】,每一根细线只读1位,那假设【8位的一根数据总线】一次就能读【8位的数(1字节)】;
那么现在一个32位的总线一次可以读4字节,如果你的数据乱排列不是按4字节的倍数,那就读着不方便;但如果都是按4字节的倍数排列,那就可以一次读完
所以需要内存对齐,那么内存对齐就记住两个:
- 1、每个类似数据的起始地址 % 该类型数据长度 = 0
- 2、整体结构体的长度要在第1条规则基础上,是最大类型数据的整数倍(不够就补几个字节)
二、整数(定点数)运算
1、整数运算的【逻辑运算】
1)逻辑运算:与、或、非、异或
(非重点,简单知道符号、表达式即可)
基本逻辑运算
复合逻辑运算
总结:
记住下面这个形式就行了,考试不怎么考
2)逻辑运算:移位
看下面图就会了,很简单没必要说
【逻辑移位】
记住这个就行:
举例:
【算数移位】
记住这个就行:
举例:
;
【重点】
- 右移是2的倍数除法:【X / 2^?】就是 【X >> ?】
- 左移是2的倍数乘法:【X * 2^? 】就是 【X << ?】
2、整数运算的【算数运算】
1)【有符号数】补码的加减运算
提示:计算机里【有符号数(定点整数)】都是用【补码】表示,别忘了
【加减运算规则】
人话:
- 1、加法:按位相加,1+1就为0而且向前进位1(超出机器码的位数就溢出舍弃)
- 2、减法:把【-Y】变成【+(-Y)】就行了,而补码的正数变负数就是【连符号位一起全部取反,末尾加1】(超出机器码的位数就溢出舍弃)
- 但是很多教程忽略二进制减法的手算过程这里我做一个补充,因为后续学习乘除法我们都得用到
;
细节教材理论如下:
【补码运算结果溢出判断】
记住这个总结,考试就考这点东西,没有什么原理不原理的,这些就是前人在计算时发现并总结的溢出的规律:
;
计算例子来验证:
【算术溢出第1种情况】
【算术溢出第2种情况】
【算术溢出第3种情况:双符号位】
2)【无符号数】的加减运算
【加减运算规则】
更简单:
- 1、加法:和【补码有符号数的加法】一样
- 2、减法:和【补码有符号数的减法】一样
【无符号数溢出判断】
例子:
3)加法的设备
加减乘除都可换算成加法
【单个全加器】
只能计算X、Y两个数中各自每1位的相加,也就是只能算【1bit + 1bit】的结果
【串行进位加法器】
要计算完整的X+Y,就要将N个全加器相连,可得到1个N位加法器,称为【串行进位加法器】,如图所示。
串行进位也称【行波进位】,每级进位直接依赖于前一级的进位,即进位信号是逐级形成的。【人话:前一个 “全加器” 依赖 后一个 “全加器” 把 进位 算出来,这个 “全加器” 才能计算,以此类推.......】
;
【留意】
有的地方会叫 “ 串行进位的并行加法器 ”,这里【“并行” 指的是 “所有全加器可同时输入X、Y”】、【“串行进位” 指的是 “每一个全加器必须等待后一全加器把进位算出”】
【并行进位加法器】
为了解决 “串行进位加法器” 的不足,有了 【并行进位加法器】,支持所有全加器同时输入、并产生各自的进位。
【重点:带标志加法器!!】
我们人类可以计算X+Y的结果的真值,来判断有没有超出机器码可表示的范围真值,但是机器不知道,所以科学家在加法器的基础上加上了【标志位】(串行进位、并行进位都有)
;
重点之超重点:
- 1、怎么求得各个标志位:
- 2、需要记得除了【ZF】【OF】【SF】【CF】,还有【Sub】这个加减法控制信号,Sub是1就是减法、0就是加法(这也是无符号数能和有符号数一样使用同一加法器进行加减法运算的原因)
做题快速技巧:(针对有符号数溢出OF 和 无符号数溢出CF)
例子:
【ALU算术逻辑单元和ALUop】
ALU就是这么一个带标志加法器,可以加、减、乘、除、与、或、非.......,也就是简而言之——ALU可以【算术运算】和【逻辑运算】
然后需要留意另外一个设备【ALUop】,它控制ALU进行哪一种运算,ALUop有N位就能控制ALU有【2^N种操作】
例子:
所以记住:ALU属于【组合逻辑电路】
需要知道有两种电路:
- 1、【时许逻辑电路】有【记忆存储单元】:可用于记忆存储(常用于寄存器、PC、移位器...)
- 2、【组合逻辑电路】没有【记忆存储单元】:没记忆,比如算A+B必须同时输入A和B计算,而不能先输入A在输入B,因为会忘了A(常用于ALU、加法器、译码器、多路选择器、移位器......)
3、乘法运算
1)【无符号数】定点乘法运算
无符号数乘法用的是【原码】
【乘法规则】
和十进制乘法差不多,你就看吧,xxx..x乘0就是000...0、xxx...x乘1就不变
另外:我们前面还讲过,逻辑运算里的【左移】其实就是2的倍数乘法
【右移】虽然是
,但其实也可以换成乘法
【乘法原理】
人类思维
(这里不是重点,仅仅是为了让大家好理解计算机后续的流程)
其实归根结底,乘法就是【加法】
十进制的乘法为什么要“逐位相乘、错位相加”?——>其实本质是【被乘数】×【乘数的每一位】之和,我们再写的时候省略的末尾的0、而写成了错位而已
对于二进制也是一样
;
那么我们还可以再简化式子,写成一个【循环相加相乘】的一个式子
-
乘法器设备思维
我个人画了一张图,我觉得根据我个人的理解这个图能够完整的显示整个机器乘法的流程:
- 1、初始化一个【部分积】(全0),后续这个【部分积】就是根据每次【被乘数 × 乘数的每一位】而不断更新得到的新的结果,存放部分积的部分称作 “ 乘积高位 ”
- 2、左边会有一个进位,初始化0,然后后续记录每次【被乘数 × 乘数的每一位】而得到的进位
- 3、右边还会有一个 “ 乘积低位 ”,用于存放乘数,最后一位就是每次要和【被乘数相乘的那一位】,后续每次执行完【被乘数 × 乘数的每一位】只会都会右移,以达到被乘数能够乘上乘数的每一位。
- 这三个东西都会被当成一个整体,没次【被乘数 × 乘数的每一位】后整体进行右移
;
当然如果不愿意看,也可以看下面湖工大计算机组成原理的图
以及王道的图
【溢出问题】
2)【有符号数】定点乘法运算
有符号数的乘法用的是【补码】
他的乘法形式叫【补码一位乘法】或【布斯(Booth)乘法】
【乘法设备】
和无符号数的区别就在下面这张图,简单来说就是:
- 1、没了存【进位】的那个1位寄存器,不专门存进位
- 2、多一个【辅助位】在低位乘积寄存器后面
- 3、控制逻辑根据【乘积低位最后一位 + 辅助位】2位来判断本轮操作
- 4、可加法也可减法
;
具体流程看下面,第一张是我手写的图
;
这个是王道的图
【溢出问题】
3)三大乘法形式
另外,乘法还有两种形式没介绍
这里我想用我的笔记来解释,简单明了
也可以看王道的(精略版)
4、除法
【除法手算规则】(非重点,基本不考)
【无符号数手算方法】
和十进制的除法规则一模一样,忽略 “原码符号位”,“逐位上商、错位相减”
当然简写方便的话,每次计算可以忽略“中间余数”前面的0,然后当判断当前中间余数不够减除数时上商0,也可以忽略写【“中间余数” - “除数 × 0”】的步骤,直接【中间余数往后移位】直到中间余数 > 除数即可
;
;
;
【有符号数(加定点小数)手算方法】
1、有符号数手算的话无非就是多个符号,在计算真值时先不带符号,算完后我们将【符号进行异或】——>【得到最后商的结果:0正1负】
2、然后定点小数的除法手算时,推荐【先不带小数点】,然后若被除数小于除数,那么直接在被除数最后一位 (也就是商的整数部分) 写【0.】,后面再进行判断来依次得到【商的小数部分】
3、然后注意:定点小数的商也是和定点整数一样,【商的尾数和被除数的小数的位数一样】
;
①可以采用先将定点小数写成定点整数的形式(推荐)
依旧是“逐位上商、错位相减”,然后最后的余数要对齐被除数第一位前,补上【0.】,然后后面到余数部分补0
②也可以直接用定点小数直接计算
但是这样写的时候注意,不要直接 “错位相减” ,要把小数点对齐,然后小数点右边的小数部分每次右移,再进行减法就行,这样也能达到错位相减的效果
【除法设备电路】
1、无符号数原码的恢复余数法
【什么是【恢复余数】:】
首先,我们在做除法决定上商0还是上商1的时候,是我们人类的脑子预算了一下,大致判断出了【被除数(或中间余数)】和【除数】的大小关系,而计算机并不会,他只会默认每一次都是【被除数(或中间余数) > 除数】——>【直接上商1】
那么【恢复余数】其实就是:【X - Y + Y = X】
在【X - Y = 中间余数】时先检查【中间余数是否小于0】:小于则【中间余数 + Y = X】,恢复原样没有任何变动;大于则正常开启下一轮的【中间余数 - Y = 下一轮中间余数】
换成二进制的流程就是
;
;
【正式的计算机逻辑】
我们需要先知道这几个条件:
- 1、做除法时我们放进去的是两个原码,表示的结果也是原码
- 2、中间的加减法运算时ALU会将它们变成补码进行运算
- 3、无符号数符号是正数,X-Y>0,则X>Y,则再+Y、上商0;X-Y<0,则X<Y,正常商1
- 4、减法用
+
;加法用
+
;
对应计算机设备:(跟乘法寄存器差不多)
假设N位的机器字长
- 1、【余数寄存器R】代表【中间余数】,初试值为N个0,后期反复存【X+Y或X-Y】的余数
- 2、【余数/商寄存器Q】代表【除数 或 商】,初试值是【除数】,后期每执行一次【X-Y】就左移1次,然后左移后【Q最右边的“留白”用来放商】,如此反复直到【除数】左移干净,然后【右边不断填满 商】
- 3、每次都先把【R】和【Q最高位】送去ALU做加法,得到新的【R】,【R>0】则【Q最右边填商1】、【R<0】则把【R】和【Q最高位】送去ALU做减法,恢复刚才的【R】,并【Q最右边填商1】