文章目录
- 第一章 计算机系统概述
- 第二章 数据的表示和运算
- 2.1.1 进位计数制
- 2.1.3 无符号整数的表示和运算(2023新增)
- 2.1.4 带符号整数的表示和运算_ 原反补(2023新增)
- 2.1.5 原反补码的特性对比(2023新增)
- 2.1.6 移码(2023新增)
- 2.1.7 定点小数(2023新增)
- 2.2.1 电路基本原理、加法器设计
- 2.2.2 并行进位加法器
- 2.2.3 补码加减运算器(2023新增)
- 2.2.4 标志位的生成(2023新增)
- 2.2.5 定点数的移位运算
- 2.2.6.1 原码的乘法运算
- 2.2.6.2 补码的乘法运算
- 2.2.7.1 原码的除法运算
- 2.2.7.2 补码的除法运算
- 2.2.8 C语言类型转换
- 2.2.9 数据的存储和排列
- 2.3.1 浮点数的表示
- 2.3.2 浮点数标准 IEEE 754
- 2.3.3 浮点数的运算
- 2022版内容(已删)
第一章 计算机系统概述
概述
计算机硬件能识别的数据
- 二进制0和1,分别对应高低电平
- 接收到高电平表示接收到1,接收到低电平表示接收到0
- 通过电信号传递数据
计算机组成原理解决问题
计算机的发展(大纲已删,但建议看)
计算机系统
- 硬件决定计算机瓶颈,软件决定计算机系统发挥的好坏
硬件的发展
微处理器的发展
摩尔定律
软件的发展
- 编程语言,操作系统,
目前的发展趋势
知识点小结
计算机硬件的基本组成
早期冯诺依曼机
冯诺依曼计算机的特点
- 运算器既要完成运算,又要中转数据程序,必然导致处理效率降低
现在计算机的结构
计组中所说的主机是 CPU+主存储器(不包括辅存)
辅存属于IO设备,指硬盘
知识点小结
各个硬件的工作原理
主存储器
- 包括主存储器,地址寄存器,数据寄存器
主存储器的基本组成
- 存储体中是一个个存储单元
- 每个存储单元有一个地址对应
- 存储单元保存的二进制数是存储字
- 存储字的位数就是存储字长,通产为8比特的整数倍
- 存储单元中具体到每个比特由一个存储元存储(电容)
- 注意:MAR位数与存储单元个数的关系,MDR位数与存储字长的关系,区分存储器里的字与字节,B与b
运算器的基本组成
- ACC MQ x 是寄存器,用来存储
- ALU算数逻辑单元,核心部件,用来算术运算,逻辑运算
控制器
- CU控制单元,核心部件
- IR PC 寄存器
计算机的工作过程
- 这个例子中,操作码与地址码加位数起来也正好是16位;第一行中地址码101,指的就是对a进行取数,a存放在地址5中,正好就是101
- 0-4保存的机器指令就是对当前的地址码存储的数据执行操作码对应的指令
- 5-8保存的数据
指令运行过程
- 仔细理解计算机执行过程,绿线代表执行顺序
知识点小结
计算机系统的多级层次结构
机器语言
- 由下图可知,完成这一步机器指令(取数a至ACC)需要9个微指令具体实现
- 二进制机器指令和微指令是计算机最底部的层次结构
计算机系统的层次结构
- 下层是上层的基础,上层是下层的扩展
- 操作系统中也有层次的划分,与这里不同,都对,只是视角不同,这里是从编程人员和硬件设计的视角划分
- 操作系统的调用也称为广义指令
- 高级语言被翻译成汇编语言,对于程序员而言,机器就好像能读懂高级语言一样,因此这个高级语言机器被称为虚拟机
- 汇编语言被执行,需要被翻译成机器语言,看起来就好像机器能读懂汇编语言一样,这个汇编语言机器被称为虚拟机
- 汇编语言也会经常调用系统指令,因此我们加上了操作系统机器这个层次
- 计算机组成原理课程重点关注下面硬件的部分
- 汇编语言
- 汇编语言有助于人类理解机器指令,本质上与机器语言没有太大区别,依然是低级语言,每一条汇编指令都和机器语言指令一一对应
三种级别的语言
- 编译型语言,解释型语言
- 解释型语言也能通过解释器把高级语言翻译成机器语言,解释型语言执行效率没有编译型语言高
- 编译,汇编,解释程序统称为翻译程序
知识点小结
计算机的性能指标
存储器的性能指标
- 这种方式求出的总容量其实是最多的容量,实际上可能达不到,做题就按照最多来算
- 熟记常见的二进制数与十进制数的转换
- 这里的K M G T是用于表示存储的单位,对应2的多少次方
CPU的性能指标
- 主频,理解为指挥CPU内部所有工作进行的一个节奏,脉冲信号给机器指令的执行带来了节奏,不同的动作对应不同数量的节奏
- 主频与时钟周期互为倒数,其他情况都一样的话,主频越高,CPU性能越好
- CPI跟实际情况有很大关系,通常给出的CPI是平均情况
- 这里的K M G T与存储容量里的不同,这里描述速率用的是10的几次方,CPU主频的G也是10的多少次方
系统整体的性能指标
- 数据通路带宽,比如,传递一个16比特的数据,带宽为8比特,就需要两次传输
- 这里的吞吐量和响应时间比较抽象宽泛,需要结合具体的应用场景,
系统整体的性能指标(动态测试)
思考
- 基准程序执行的越快,不一定性能越好,可能基准程序专注于执行测量某些指令,而我们实际应用需要频繁使用另一些指令
知识点小结
第二章 数据的表示和运算
2.1.1 进位计数制
知识总览
十进制计数法
推广:r进制计数法
- 十进制最符合人的理解方式,二进制最适合计算机存储和处理,八进制和十六进制与二进制能很好地转化,相当于把二进制表示的数简化,利于阅读
任意进制转十进制
- 重要考点
二进制与八进制,十六进制相互转换
各种进制的常见书写方式
十进制转任意进制
- 整数部分,除基取余法,小数部分,乘基取整法
- 十进制的整数可以用二进制精确表示,十进制的小数部分可能无法用二进制精确表示,按精度保留小数位即可
十进制转二进制(拼凑法)
- 草稿纸上先列出二进制的各个位所代表的十进制数,拼凑出所求的数,数值不大时推荐使用这种方法
真值和机器数
知识点小结
2.1.3 无符号整数的表示和运算(2023新增)
2.1.4 带符号整数的表示和运算_ 原反补(2023新增)
2.1.5 原反补码的特性对比(2023新增)
2.1.6 移码(2023新增)
2.1.7 定点小数(2023新增)
2.2.1 电路基本原理、加法器设计
算术逻辑单元ALU
- M代表当前是算术运算还是逻辑运算
- S0-S3代表当前执行的是哪一种逻辑运算或者算数运算,可以对应16中状态
- A B输入,F输出,机器字长其实就是ALU可以同时支持多少位的运算,即A或B的位数
- 通常ALU可以同时处理多少位数据,其他几个寄存器的位数与ALU保持一致
最基本的逻辑运算
- 与或非
- 门电路
- 优先级:与>或,类比乘法加法,分配律,结合律,逻辑表达式简化的意义在于可以节约元器件
- 逻辑表达式本质上是对电路的数学描述,优化逻辑表达式就是在优化电路设计
复合逻辑
- 利用基本逻辑组合实现,只要能得到数学表达式,也就可以画出对应的门电路
- 同或就是异或的取反
- 异或的逻辑可以天然的实现加法运算和奇偶校验
奇偶校验
- 偶校验:确保加上校验位之后,整体的1的个数为偶数
- 奇校验:确保加上校验位之后,整体的1的个数为奇数
- 偶数个1异或结果是0,因此,对已知的信息进行异或,得到的结果正好可以作为偶校验位
用门电路求偶校验位
用门电路实现加法运算–一位全加器
串行加法器
- 用一位加法器实现多位加法运算
- 效率比较低
并行加法器
- 采用多个全加器
- 虽然上一个全加器的进位作为下一个全加器的输入,虽然可以同时输入多位的信息,但是仍然需要低位运算完成,想高位提供进位信号,才能往下计算,因此又称为串行进位的并行加法器
- 并行加法器的计算速度很大程度取决于每一位进位的产生速度
知识点小结
2.2.2 并行进位加法器
知识点比较绕,需要调整心态,了解即可,不是考试重点
串行进位的并行加法器
- 加法器的速度收到进位信息产生的速度的影响
如何更快的产生进位信息
- 带入展开Ci,一直到最初的带入C0,其实从一开始就可以根据逻辑运算求出所有的进位,而无需逐位传送
- 大大提高运算速度,就是比较消耗电子元器件
并行加法器的优化
- 简化上面的表达式
- 通过表达式可以看出,每一位的进位信息可以几乎同时算出
- 继续套娃会导致电路越来越复杂
- 经典做法,4位一组,一个组内每个加法器并行计算
- 表达式中的Gi和Pi可以在一位加法器中引出信号,
并行加法器的优化–组内并行,组间串行
- 几个4位的并行加法器进行串联,可以继续扩展加法器的位数,此时的分组与分组之间还是一步一步的传递进位
- 称为,组内并行,组间串行进位方式
并行加法器的优化-组内并行,组间并行
- 如何对分组之间进行优化?再次套娃
- 以组为单位简化得到G1和P1,称为组进位产生函数,组进位传递函数
- 对组之间的进位信号进行带入求解,可以发现,组间进位信号与组内进位信号结构上是一样的
- 已知了Ai和Bi就相当于已知了Gi和Pi,就相当于知道了Gi和Pi,加上C0已知,
- 所以组间进位信号也相当于各组之间并行产生
- 会用CLA电路,对各组件进位函数进行整合和传递,使得各组可以几乎并行完成组间的进位
ALU芯片的优化
2.2.3 补码加减运算器(2023新增)
2.2.4 标志位的生成(2023新增)
2.2.5 定点数的移位运算
算数移位
原码的算数移位
- 定点整数和定点小数同理
补码的算数移位
- 正数和负数移位时区分开
补码的算数移位
- 负数的补码是从反码+1得来的,需要找到分界线,左右区别对待
算数移位小结
算数移位的应用举例
- 计算机硬件对算数乘法的实现是通过加法和算数移位完成的
逻辑移位
逻辑移位的应用举例
- 用3B表示RGB颜色
循环移位
- 不论左移还是右移,移出来的这一位都会补到另一侧的空位上
- 带进位位,其实就是有些数值保存的时候如果超过了表示上限,还会加上一个进位位,带进位位的移位,其实就是把这个进位位也算在一起进行循环移位了
- 循环移位适用于,保存汉字时,大小端的切换,即左右两个字节调换排列顺序
知识点小结
2.2.6.1 原码的乘法运算
手算乘法(十进制)
- 乘数的每一位分别与被乘数相乘,把这些相乘的结果错位相加,错位相加是因为乘数的每一位权重不同
手算乘法(二进制)
- 乘数的每一位乘以被乘数,二进制只有0和1,所以也可以看成加上或者不加
- 每一个结果错位相加,越是乘数的低位乘以被乘数,最后累加时向右移动的位数越多,因为权重不同
原码一位乘法
- 符号位单独运算,用异或,即同号结果为正,异号结果为负; 数值部分单独算,数值部分就是取绝对值的原码
- 相乘的过程,使用运算器的寄存器实现
- ACC用来保存每一轮的结果(初始为0),MQ保存乘数,x保存被乘数,MQ深灰色是当前和被乘数相乘的这一位
- 灰色部分为1就是把被乘数汪ACC上加,灰色部分为0就是什么也不加
- 每一轮,ACC整体都要逻辑右移一位,ACC左侧的高位补0;这么做的意义
- 每右移一位其实就是灰色部分变成了乘数的更高位去和被乘数相乘,MQ右侧的移出的位丢弃不要了
- MQ右移之后,左侧空缺,正好可以用ACC右移过来的结果利用,ACC右移是为了满足错位相加
- 以此类推,直到MQ的原本的最高位完成相乘
- 注意结果小数点的位置,以及确定符号
- 为什么ACC叫乘积高位,因为ACC保存的就是最终结果的高位部分
- 为什么叫原码一位乘法,用原码计算,每次用一位乘
原码一位乘法(手算模拟)
- 这里的原码乘法使用了双符号位,其实单符号位也不错,但是补码乘法必须使用双符号位,因此这里就统一使用了双符号位
- 课本给的结果是二进制的真值,答题还是推荐写出这个真值的原码机器数
2.2.6.2 补码的乘法运算
补码与原码的一位乘法对比
- 与原码的一位乘法很类似,但也有区别
补码一位乘法运算的硬件
- 把MQ的容量多扩展1位作为辅助位,辅助位默认为0
- 每一轮运算之后ACC和MQ整体右移,相应的MQ最低位(灰色)和辅助位(红色)也会得到更新,辅助位右侧的可以丢弃
- 这里的所谓的MQ最低位只是为了方便我们理解记忆,真正的最低位还是MQ原本乘数的最低位
- 通常运算器的所有寄存器都是统一容量的,所以ACC和x也扩容1位,放在高位上,作为双符号位使用
- x与MQ初始值,x是把被乘数带着双符号位完整的存进来,MQ也是把乘数用单符号位完整的存进来(另一个位是辅助位)
- 为了快速转换,会有辅助电路,实现x的补码到-x的补码的转换
补码一位乘法(手算模拟)
- 当数值部分统一为n(这里是4)时,一共会有n轮加法,最后再加一轮
- 前n轮加法,怎么加看图中规则,加的时候连带符号位一起算,每轮加法完成,对ACC和MQ整体进行算数右移
- 算数右移就是,当前的ACC符号位不变,数值部分右移,当前的符号位是什么,就在数值的位置补什么
- 第n+1轮,加法规则同前面一样,但是加完后不再移位,虚线左侧的数就是最终得到的结果(补码形式)
- 为什么会有第n+1轮,就是因为MQ(乘数)的符号位也要参与运算
- 课本中的Y5就是辅助位,Y4就是“最后一位”
知识点回顾
2.2.7.1 原码的除法运算
手算除法(十进制)
手算除法(二进制)
穿越
原码除法–恢复余数法
- 符号单独算,商的数值用除数和被除数的数值来计算
- ACC存放被除数,余数,x存放除数,MQ存放商(初始值为0),这里的被除数就是分子,除数就是分母
- MQ灰色就是当前需要确定的这一位的商
- 上商的时候,计算机还不知道被除数(或余数)和除数谁大,先上1,如果ACC小于x就把ACC恢复回来
- 先上1,然后ACC-x,具体实现就是ACC加x的绝对值负值的补码,加完结果为正数,则继续往下走,加完结果为负数,说明搞错了,商变0,ACC+x恢复了余数,然后继续往下走
- 接着上一步,ACC和x整体左移1位,ACC左侧的丢弃,MQ灰色的位置就是我们将要确定的下一位的商
- 重复上一步操作,直到MQ全部确定,MQ最后一位商确定的时候,如果余数为正,直接结束,得到商和余数;如果余数为负,则商变为0,恢复余数,得到商和余数
原码除法–恢复余数法(手算)
原码除法–加减交替法(恢复余数法的优化)
- 把恢复余数和下一步的移位合并成一个步骤
- 商的符号还是单独算
- 最终的余数的正负性与商相同,如果最终的余数为负,还是要将其变为正确的余数,也就是加上除数的补码
- 加减交替法的左移次数比上商次数(或者加减次数)少1,最终可能还要再多加一次(恢复余数),即n+2次,但是不用移位
注意
- 我们讨论的是定点小数的除法,规定被除数一定要小于除数,否则商将会大于1,定点小数无法表示大于1的数
- 其实第一步的商就能判断,正常情况第一步商一定是0(也就是加完之后结果为负),如果第一步商得1,说明被除数比除数大,硬件检测就会直接停止运算了
2.2.7.2 补码的除法运算
2.2.8 C语言类型转换
强制类型转换
- C语言中定点整数是用补码存储的
- unsigned修饰的short int long是无符号数
- 长度相同的无符号数与有符号数之间转换,数据不变,改变解释方式
- 长数据转为端数据,高位阶段,保留低位内容
- 有符号数从短转为长,高位根据符号位进行扩展;有符号数从短转为长,高位补0
2.2.9 数据的存储和排列
大小端模式
- 多字节的数据在内存是连续占据内存地址的,每个字节保存整个数据的一部分
- 大端模式:数据的高位部分保存在地址小的字节里,低位部分保存在地址大的字节里
- 小端模式:数据的低位部分保存在地址小的字节里,高位部分保存在地址大的字节里
- 大端方式适合人阅读,小端方式适合计算机处理
边界对齐
- 一个字可以分为两个半字,一个半字有两个字节
- 现代计算机通常是按照字节编址,1个字节对应1个地址,但是也支持按字,按半字来进行寻址
- 已知字地址,求字节地址,将字地址逻辑左移2位,即乘4;
- 注意,每次访寸只能读写1个字的内容,而且是图中的一整行的字,不可以跨行,基于这种特性,有的计算机采取边界对齐的存储方式,有的计算机采取边界不对齐的存储方式
- 边界对齐方式,一个整行字还剩1字节,但是要保存一个半字或者字,只能换下一行开始保存
- 边界不对齐方式,一整行字剩余的字节不足以保存下一个数据,可以将数据拆分成几个字节,保存
- 读取边界对齐方式的数据时,一次读取即可,效率高,可能浪费内存;读取边界不对齐方式的数据时需要读取多次(一次只能读一行),节约内存,但读取效率降低
- 边界对齐:空间换时间;边界不对齐:时间换空间
2.3.1 浮点数的表示
定点数的局限性
从科学计数法理解浮点数
浮点数的表示
- 十进制的科学计数法的阶码的底为10,浮点数的阶码的底通常为2,有的地方可能会说可以为2,4,8等,无非是就是底为4时,阶码每变化1个数值,小数点移位两位
浮点数表示举例
- b=+1.001,如果用浮点数表示,会多出一位无处存放,只能抛弃,因此b的精度就会有损失
浮点数尾数的规格化
- 如果是十进制科学计数法,我们会要求尾数的最高位不能是0,0是无效的,会丧失精度(图中为+14+0.003),写成+11+3.026的方式才是有效的,这是科学计数法的规格化
- 对于二进制浮点数的规格化,b的位数部分001001,第一个0是符号位不能动,第二位是小数点后的最高位,没必要给0,可以把小数点右移一位写成01001,然后阶码-1,结果还是一样的,且多出最低位1有了存放位置
左规和右规
规格化浮点数的特点
- 浮点数的表示范围已经从408考纲删除了,了解即可
知识点小结
2.3.2 浮点数标准 IEEE 754
移码
- 移码的原生定义,移码=真值+偏置值,其中偏置为2的(n-1)次方,8位移码的偏置值为128
- 基于这样的移码定义,刚好可以呈现出特性,移码就是在补码的基础上把符号取反即可
IEEE 754标准规定的偏置值
- 移码只能用来表示整数,IEEE 754标准采用移码表示浮点数的阶码
- IEEE 754规定移码中的偏置值为2的(n-1)次方-1,如,8位移码的偏置值为127
- 由此可得,-128的移码为1111 1111(默认加了一次模2的8次方),-127的移码为0000 0000
- 相当于基于我们原生的的移码全部-1
IEEE 754标准
- 规定了浮点数的标准格式
- C语言的float double long double就遵循了这个标准的短浮点数,长浮点数,临时浮点数的格式
- 标准规定尾数用原码表示,因此我们希望尾数的最高位是1,确保精度值,因此干脆就默认尾数的最高位为1,并且隐藏了,不再占用尾数部分的位置
- 因此,短浮点数尾数有23位,其实表示了24位的尾数,即1.M
- 阶码的范围是-126-127,-128和-127因为是全0和全1,留着单独用
- 偏置值为2的(n-1)次方-1
- 考试不会给表格,需要自己熟记表格里的标准
- 技巧,阶码真值和移码换算的时候,可以先看做是无符号数,与偏置值计算完以后,在转为对应的二进制数
举例
规格化的最小绝对值和最大绝对值
阶码全1和阶码全0的特殊用途
- 进一步扩展单精度浮点数的绝对值的范围
知识点小结
2.3.3 浮点数的运算
浮点数的加减运算(十进制科学计数法)
浮点数的加减运算
- 考试中给定的浮点数运算不太可能是IEEE 754标准的浮点数,因为最短都要32位,太长不利于计算,可能像图中所示,给定一个短的浮点数格式,按照给定格式进行计算
- 这里一定要结合原视频多看多理解,很多细节容易出错,做题强化记忆
- XY对阶之后开始做减法运算,转为补码形式计算,补码也要加入计算,计算结果的符号位为10,说明尾数发生溢出;也可以自行用十进制科学计数法计算X-Y证明确实是尾数发生溢出
- 尾数发生溢出,需要进行右规,小数点左移一位,低位抛弃,计算结果的符号位10,1才是真正的符号,所以右规之后,符号位再补上一个1,然后阶码+1
- 这里由于我们计算尾数后低位抛弃,其实就是完成了舍入操作
- 第五步的判断溢出,主要是在看阶码是否超出表示范围
浮点数的加减运算–舍入
- 右规时就会面临舍入的问题
- 两种方法
- 当阶码的值超出上限,则发生上溢,尾数数符为正,则为正上溢,尾数数符为负,则为负上溢
- 当阶码的值低于下限,则发生下溢,直接当做机器数0即可,即令阶码为0
- 下溢当做机器数0处理,上溢当做异常处理
- 有的计算机还会把浮点数的尾数拿出来,单独处理
强制类型转换
- 现在电脑大多64位,考试习惯基于32位机器考
- 判断精度是否丢失主要看尾数的位数是否够用
- 判断溢出主要看阶码所表示的范围是否导致溢出
知识点小结
2022版内容(已删)
*BCD码(大纲已删,408不考)
字符与字符串
ASCII码
- 常用的数字,字母,符号一共128个字符,理论上7位二进制够用,实际在最高位补个0,凑足8位
- 数字的编码,大写字母的编码,小写字母的编码,都是各自连续的
- 32-126号字符是可以印刷打印的,其余的为控制,通信字符
汉字的表示和编码
- 一个字节最多表示256种状态,远远不够表示常见的汉字
- GB 2312-80:80年的,可以表示汉字+各种符号供7445个
- 区位码,相当于二维坐标的方式唯一标识了汉字,94个区,每个区94个位置,即0-93,符合人的理解方式
- 国标码,基于区位码的数值再加32(20H),是为了不与键盘的控制通信字符的ASCII冲突,可以共存
- 汉字内码,基于国标码的数值再加128(80H),保证了高位为1,这样任意一个汉字内码的两个坐标值,都不会与ASCII有重合,二者可以共存被计算机识别区分
- 此外还有UTF-8编码方式等等
- 输入编码:如汉字内,输入nei2,输入法软件会得到对应汉字的国标码,再由系统或应用软件转为汉字内码,最终存储
- 输出:汉字能够被输出显示出来,需要将国标码或汉字内码转为汉字字形码,汉字字形码对应由01表示的矩阵,1有像素,0无像素,
字符串
- 假定每个地址对应1字节,从地址为2的位置开始存储
- 如果是ASCII编码的字符串,正好占1个字节保存,结尾用\0(即00H)作为字符串结尾的标志
- 如果是带有中文字符的字符串,GB2312-80编码,一个中文字符需要占两个字节,分别存放机内码的两个维度坐标
- 大端模式小端模式,即多字节的数据保存时排列顺序不同
知识点小结
奇偶校验码(计组大纲已删,计网考)
海明校验码(计组大纲已删,计网考)
循环冗余校验码(计组大纲已删,计网考)
定点数的表示
定点数和浮点数
- 定点数:我们所习惯的方式,显示的表明小数点的位置
- 浮点数:科学计数法的方式表示,
本节总览
- 原码,反码,补码,移码是重点,高频考点,熟练掌握这几种码的表示以及相互转化
- 多做题自然就会熟练掌握
无符号数的表示
- 只表示数值,没有符号,无符号数的表示范围
- 通常只讨论无符号的整数,没有无符号的小数
有符号数的定点表示
- 有符号数的定点表示是把定点正数和定点小数分开表示
- 规定定点整数的最高位为符号位,默认小数点就在最低位的后面
- 规定定点小数的最高位为符号位,默认小数点就在符号位的后面
- 一个定点数,去掉符号位,剩下的就是数值部分,也成为尾数
原码
- 书写时注意看原题要求,如果规定了定点数需要占多少位,就要把该有的0补上,如果没有规定,则可以把多余的0省略掉,
- 比如定点整数的数值部分的高位的多余的0,和定点小数的数值部分的低位的多余的0
- 注意,定点数的最高位是符号位,不代表数值
原码的表示范围
- 注意,真值0有两种表示,因为有+0和-0
反码
- 反码与原码是一一对应的,所以反码与原码的表示范围是相同的
- 也有+0和-0
- 取反的时候只是数值部分取反,符号位不变
- 反码只是原码转为补码的中间状态,实际没什么用
补码
- 正数的补码=原码,负数的补码=反码+1,要考虑进位
- 补码的真值0只有一种表现形式,多出来的一个表现形式,我们来人为规定了
- 多出来的人为规定的,正数给了-2的n次方,小数给了-1,机器字长n+1位
- 补码的表示范围,比原码多了一个
移码
- 在补码的基础上把符号位取反
- 移码与补码是一一对应的关系,表示范围也相同,真值0只有一个表现形式
- 为什么设置移码?移码在他的表示范围内,可以直观的看到整个二进制数值是递增的(从负到正),有利于计算机硬件进行比较大小
几种码表示定点整数
练习
知识回顾
各种码的作用
使用原码运算的问题
- 减法器逻辑比较复杂,实现起来成本很高
用加法代替减法
模运算的性质
加减运算改进
- 假定计算机能表示8比特的数,00000000-11111111,当加法运算超出这个范围,计算机只会保留最低的八位
- 相当于计算机天然的完成了对11111111的模运算
- 将一个正数减另一个正数转化为一个正数加另一个正数的补码,一个数的补数就是这个数的补码
补码的作用
- 使用补码进行加法操作时,符号位一起参与运算
- 思考,溢出问题怎么解决
移码的作用
- 方便对比大小
加减运算和溢出判断
原码的加减运算
补码的加减运算
- 不论加法还减法,最终都会转为加法,符号位也参与运算
- 但是可能会出现溢出
溢出判断
- 正数+正数才会上溢出,负数+负数才会下溢
- 基于规律总结,有三种判断方法
方法一
- 注意,这里的逻辑表达式,乘法表示与的运算,加法表示或的运算
- 有了逻辑表达式,可以很方便的用门电路实现
方法二
- 这里的符号进位C5和最高位数值位的进位C1含义
- 当两个数符号位都是1的时候,就会产生符号位进位,且进位值为1,即C5=1
- 当两个数值相加时,最高位还需要向前进位,则C1=1
方法三
- 把符号位拓展成00和11,相加的时候所有位参与运算和进位
- 如果得到结果符号位为00或11表示正数或负数,没有溢出;如果得到结果符号位01或10表示发生了溢出
- 方法三和方法二其实一个意思,在实际存储时只存储一个符号位,运算时才会复制一个符号位,然后参与运算
- 最长考的一种方法
符号扩展
- 原码扩展补0,反码扩展补1,补码扩展分两边情况
- 定点小数的扩展同理,与定点整数同样的规律
知识点小结