计组第二章:数据运算
第一节:数制与编码
补充内容:
机器数内,补码表示整数、移码表示阶码、原码表示浮点数尾数部分
需要进行位拓展的原因:
ALU的位数是固定的,运算前可能需要把短数据扩展为长数据
通用寄存器位数是固定的,把数据存入寄存器时,可能需要进行长度扩展
主存内的各种数据长度不一,有时需要把短数据扩展为长数据
进位计数法:
只需要记忆二进制、八进制、十六进制分别的前缀和后缀即可,容易遗忘和混淆
进制数转换:
二进制转为八进制、十六进制小数点左边高位补零,右边低位补零,解释均从右向左翻译
十六进制、八进制的互相转换经由二进制完成互相转换
十进制转为十六进制、八进制首先转为二进制再考虑转为高位进制
十进制整数转为二进制直接考虑凑整法,速度远高于书上给定的计算方法
对于小数部分若位数少于五位内可以直接凑整,高于五位建议用乘基取余法得结果
高位进制(十进制)能覆盖所有低进制表达范围,低进制不一定能表达高进制
四大码以及相应计算:
高位、低位补零的数量具体以字长为定,低位、高位均是以零拓展不以其他拓展
提纲:(写一遍下列的转换过程是最迅速、最有效的回忆方法
1.真值转原码、反码、补码、移码;2.原码转真值、反码、补码、移码
3.反码转原码、反码、补码、移码;4.补码转真值、原码、反码、移码
5.移码转真值、原码、反码、移码;6.补码转其负值补码
参考篇目:码的互相转换以及补充
相应表示范围和特点:(根据下列图表进行一次回忆,这是最迅速有效的复习方法
书上需要注意的内容是各个码的特点和其应用场合、比较对比,容易被忽略
整数的表示:
无符号整数的取值范围大小和有符号整数的取值范围大小相同,无非范围不同
在计算机中尤其要注意有符号数的默认表示方式(有符号整数)均是以补码形式存储的
后面习题里面也有不少这样的坑存在
C语言类型转换:
整型数据类型需要记忆、背诵和默写,这是没办法的事情
有符号转为无符号、无符号转为有符号只改变了对内部存储的补码的解释方式而已
注意内部以补码方式存储,所以解释的时候就会有一些小细节存在
无符号数和有符号数的结合运算以无符号数为准,运算均是基于补码的(不论加减都是
强制转换长转短直接截断、短转长永远以最高位符号位去拓展,以补码方式解释
习题总结分析:
1:对于十进制转二进制、八进制、十六进制,如果低于十位可以直接转,能够凑的
高于十位建议采用书上的除基取余的方法
4:反码、原码零的表示均不唯一,补码和移码均唯一,建议回顾上述内容即可反应出
5:补码转原码,正数补码和原码、反码一样,负数对应改变即可
6:一个比较重要的结论,记住即可,全部取反后加一即可得到其补码相反数
7:原码、反码能表示的数的量均是255个,因为有重复的零,其他均是256个不同的数
11:需要注意的是补码当表示负数的时候后面一越多越大,零越多越小,图表内容
13、14、17:人不会两次踏进同一条河流,但我真的会重复犯当时错过的问题
本质是因为这边是补码,而个人计算的时候一直用原码考虑,因而导致了犯错
按照图表即可迅速做出来结果
23:需要注意的是补码负数表示为:-1到-128,正数表示为0到127,所以会产生溢出
24:关于移码的计算,个人的建议是直接写出机器数后再减去偏移量,这样更加直观些
30、33:注意在计算机里面无符号、有符号整数均是以补码形式存储的,需要注意
在有符号情况下,需要特别注意解释的问题,无符号反正是原码直接解释就可以的了
第二节:运算方法和运算电路
基本数电知识:
运算器的基本构成和介绍
基本运算部件的介绍,运算器的基本构成、基本功能需要记忆,偏考察内容
带标志加法器
带标志加法器的基本原理需要了解,否则做题的时候困难会有些困难
主要看标志位的生成是如何实现的,这一块考察比较频繁(虽然理解功能即可
加减运算电路部分在统考曾经以小题考察过一次,需要知晓其运行流程
ALU及相关考点
此外一个较容易考察的是多路选择器、三态门、ALU的位数和功能间的关系
MUX(多路选择器:
ALU支持K种功能则需要logK个输入信号位,和多路选择的含义一样的
若是八个输入端则需要3位二进制来表达不同的输入端口号
本质用二进制表达端口号,控制信号即为指定该位置的输入可进入
三态门,区分于非门,当op为1时允许通过,当op为0时禁止信号通过
op只需要一位即可,因为一位就是二进制的0和1两种状态
带标志加法器的标志位:
PS:标志位本身是一定会被如实计算出来的
这就是书上注意中“运算器本身无法识别所处理的二进制串有符号与否”所表达的
不论是有符号还是无符号,这一些标志位全部都会计算出来,不管有没有意义
1.无符号数
关于进位、借位符CF、无符号数溢出判断:
这一块的内容具体建议看笔记(写在草稿上,和全加器的电路、加法原理可以结合
当加法的时候,输入端进位为零,两个无符号数相加若产生了最高位进位即为溢出
当减法时,输入端进位为一,减数运算中转为其补码形式,其符号位隐含在外
若两者相加的结果没有产生最高位进位,即隐含符号位是一个负号,自然表示溢出
因为无符号数不能表示负数
上述即为两种溢出情况,具体可随意列举例子辅助理解
ZF零标志:
每一位的本位和或非即可得到结果,若全为零即为零,无符号有符号均有意义
无符号全零表示为零,补码形式下全零也表示为零(均以补码解释,带符号与否罢
2.有符号数
SF最高位符号:
因为无符号数最高位就是零实际上表示没意义,所以SF只用于表示有符号数
OF溢出标识:
溢出判断的第三种方法常被用于加法电路中的溢出判断
有符号数溢出判断:
一般二进制数运算,只有负+负、正+正、负-正、正-负会溢出
在补码表示法中后面两者减法均会变为加法,转为前面两种情况
一位符号位判断:(也称模二补码
最终即为两个同符号数相加产生了不同符号数即为溢出
双符号位判断:(也称模四补码
或者采用双符号位,最高位记录先前的符号,次高位记录当前符号,如果不同即溢出
数值位进位、符号位进位判断:
实际上应该从原理角度理解,一个位的值由三者确定,两个本位、一个低位进位
可以列出具体的真值情况,当且仅当本位进位和低位进位相同的时候不可能产生溢出
其实本质依旧是两个相同符号位在运算后是否产生不同符号位的问题(草稿上有
记忆即可,电路原理很少具体考察
二进制运算:
移位运算:
分为算数移位、逻辑移位;一者基于无符号数、一者基于有符号数
算数移位分为:原码移位、补码移位、反码移位
逻辑移位:全部位都参与运算
算术移位:
原码左移,符号位不参与移位;原码右移,符号位不参与移位
补码左移,符号位参与移位;补码右移,符号位参与移位,正数添0负数添1
计算机中默认以补码类型存储整数,除非特别声明原码,不然都按补码方式进行移位
逻辑移位溢出即为高位进位为一,精度损失则为低位移除一个一
算数移位溢出即为左移前后符号位产生变化(注:符号位也参与运算,低位出一损精度
需要注意的是不论怎么移动一次性移动多位需要观察每一次移动后是否发生溢出
如果其中有一次产生了溢出,那么这个移动就是溢出的!!!!
二进制加法计算:
只需要训练加法运算、Y补转-Y补即可,只需要多练习几遍即可迅速反应
除法、乘法运算:
建议参考PPT,只需要掌握原码乘除法即可(何况即使是这两者统考也从来没有考察过
习题总结分析:
1:ALU是运算器的核心部件,ALU的核心部件又是加法器,ALU是算数逻辑单元
2:数据通路在计算单元、控制单元中都是必然存在的,同时还需要存在控制反馈通路
4:补码符号位参与移位,需要注意的是这题移位是溢出的
需要把移位看作是一次次分离的移动,而不能视作一次整体观察结果
中间但凡出现有一次移位溢出,那么就代表这次移位溢出
5:算数左移溢出,意味着有符号数最高位移动后符号产生了变化,无符号则是移出一
6:负数补码,最高位参与移位,右移一位,最高位补符号位即可
7:十六进制、八位进制数相加可以不考虑转为二进制,而直接在进制基础上运算
8:补码左移、右移符号位均参与移动,右移以符号位补充,左移低位补零
9:溢出判断电路必须依赖于异或门
移位电路一般依赖于多路选择器、移位寄存器、ALU实现,一般不用门电路(较复杂)
译码电路一般在存储器单元、控制器单元中(用于解析地址和操作码
编码电路很少见到,但一般会出现在中断向量的构成(中断信号编译为中断向量
10:注意“根本原因”,考察这种类型直接往最深的原因找,越偏硬件的描述越准确
11:此类类型题目,建议首先将补码转为原码再转为十进制值运算
因为十进制是一眼就能看出来在不在范围内的,而二进制就不一定了(接触时间短
12:存储时只需要一个符号位即可,模四补码仅在ALU运算单元(移位、四则)双符号
其他部件内模四补码只采用一位符号位(逻辑运算部件内)
20:不论逻辑左移还是算数左移的结果均是一样的,但逻辑右移和算数右移不同
21:输入端信息X和Y,Y要么全部取反,要么保持不变(减数)
依靠输入端的进位零或者一来调整是否是加减法,加法进位为零,减法进位为一
恰好可以把Y转为补码进行运算
在运算器内是不含符号位的,符号位是隐含在外的!!!因而进位与否决定是否溢出
减法不进位溢出,加法进位即溢出
不论无符号数还是有符号数,在计算机中均默认以补码解释!
22、24:Y的补码得到-Y的补码是全部取反后再加一,而不是除符号位取反后加一
25:INT、short类型均默认是有符号整数
按照原码转为补码的规则进行转换,先转为其对应的原码,再转为对应补码即可
不要和高位拓展相互混淆,这个并没有涉及到位数拓展,但确实可以联系起来考察
位拓展是位数不同的时候的拓展,这里仅仅是原码转补码,不要联系
26、28:最简易、迅速的方法就是直接计算其十进制数再反求其范围即可
27:乘二就相当于左移一位,除二相当于右移一位,具体用补码的移位法即可
31:
32:
第三节:浮点数计算和表示
浮点数规格化:
左规:当基数默认为二的时候每次左规都是一位,直到最高位有效位为一为止
左规的结果是尾数增大,阶码相应减小
当基数为四时,每次左规移动的位数就是两位(二进制下),需要保证该两位均为零
当最后一次准备左规前发现最高两位中至少有一位不是零,则放弃左规
右规:只需要进行一次即可,尾数右移一位或者两位(二、四为基数的情况)
右规的结果是尾数减小,阶码相应即为增大,只有这种情况可能会导致上溢中断情况