说明:为确保您能及时享受本站服务以及便于查询已购買记录请填写真实手机号!(注册后可随时修改密码!)
登录密码已默认为您的手机号,如需修改请点击“”
已为您自动登录,秒钟後将自动关闭此窗口
不管您以前是否购买过输入您的手机号即可验证:
◇ 如果以前购买过,验证通过即可查看购买记录以及继续购买;
◇ 如果从未购买,填写手机号后即可随时通过该手机号购买。
为方便您随时查询购买记录请输入您的手机号:
手机号仅作为购买的憑证,本站严格保密请放心填写。
找回密码需要验证您的账号信息
验证通过!请重新设置您的登陆密码(为方便您记忆建议您以手机号作为新密码!):
恭喜您!密码成功找回,请牢记您的新密码!
已为您自动登录秒钟后将自动关闭此窗口!
找回密码需要验证您的手机号:
验证通过!请重新设置您的登陆密码(为方便您记忆,建议您以手机号作为新密码!):
恭喜您!密码成功找回请牢记您的新密码!
已为您自动登录,秒钟后将自动关闭此窗口!
赠送打印版总页数约327页,A4纸胶装
第一部分 名校考研真题
第二部分 经典教材课后习题
白中英《计算机组成原理》(第5版)课后习题
第1章 计算机系统概论
第2章 运算方法和运算器
第3章 多层次的存储器
第5章 中央处理器
第7章 外存与I/O设备
第8章 输入输出系统
第9章 并行组织与结構
唐朔飞《计算机组成原理》(第2版)课后习题
第1章 计算机系统概论
第2章 计算机的发展和应用
第5章 输入输系统
苐6章 计算机的运算方法
第8章 CPU的结构和功能
第9章 控制单元的功能
第10章 控制单元的设计
第1章 计算机系统概述
第2章 数据的表示与运算
第3章 存储器的分层
第7章 输入输出系统
计算机组成原理考研模拟试题及详解(一)
计算机组成原理考研模擬试题及答案(二)
用圣才电子书APP或微信扫一扫,在手机上阅读本书
圣才电子书(武汉)有限公司 提供技术支持和信息存储空间
进位制是一种记数方式亦称进位计数法或位值计数法,以有限种数字符号来表示无限的数值使用的数字符号的数目称为这种进位制的基数或底数。
常见的有:二二进淛精度八二进制精度,十二进制精度十六二进制精度。
先来点基础十二进制精度的构造可以这样,比如1024可以使用按权展开法构造:权值为10,指数从0开始
只需要将以十二进制精度表示的数不断除以2,直箌商为0得出的余数逆着写就可以得到,称为重复相除法如下图:
假设十二进制精度为:101,则:
类似的十二进制精度转八二进制精度呮要一直除以8,十二进制精度转十六二进制精度只要一直除以16
这种方法每次十二进制精度數减去一个与十二进制精度相近的以2为底的指数,能减的记为1不能减的记为0,并记录相减的结果然后再把刚刚记录的结果重复以上操莋,直到整减
使用的是重复相乘法,将小数部分乘以2(分数也可以)然后取整数部分,剩下嘚小数部分继续乘以2继续取整数部分,剩一直取到小数部分为零为止(或者积为1为止)如果永远不能为零,就同十二进制精度数的四舍五入一样按照要求保留多少位小数时,就根据后面一位是0还是1取舍,如果是零舍掉,如果是1向入一位。换句话说就是0舍1入如丅图:
注意:小数点的二二进制精度中的指数是从-1开始的,一直减小整数的二二进制精度中的指数是从0开始的,一直增大
针对二二进制精度来说可以分为两种:
假设二二进制精度以8位为例,有符号数得把最高位作为符号位那么其余7位来表示二二进制精度数,而无符号数8位都可以表示一个二二进制精度数所以有符号数可表示的最大值比无符號数可表示的最大值小:
有符号数可表示的最大值: -> 127(最左边,也就是最高位为符号位所以可表示的范围只有后7位)
无符号数可表示的朂大值: -> 255(没有符号位的概念)
对于有符号数可表示的最小值,比较特殊通过上面的公式,有符号数可表示的最小值为-128这里有个问题?为什么是-128而不是-127不应该是(最高位为符号位)??等学了补码和反码在补充!因为其实-128是用补码表示的
Java中没有无符号数,C++有
有苻号数可以分为正值,原码、反码、补码四种编码实现
正值:其实就是求出一个数的绝对值的二二进制精度数,不看符号位比如-3的正徝:0011;4的正值:0100。后面要用该知识
原码其实就是有符号数:在符号位使用0表示正数、1表示负数。就是为了能够表示负数
但是可以发现,对于十二进制精度数0按照原码的表示,可以有00和10这样就有争议。更重要的是当两个符号位不同的二二进制精度进行运算时,会出錯例如:1+(-1)=0,在计算机中是使用二二进制精度运算的假设二二进制精度数有4位,所以变成:10换算成十二进制精度为-2,这明显错了
当嘫也有另一种运算方式:判断两个操作数绝对值大小,使用绝对值大的数减去绝对值小的数对于符号值,以绝对值大的为准但是这样恏麻烦啊!!而且计算机规定只会加法操作(因为只有加法器,先不管其他操作怎么处理)
自从引入原码,那以后给出的二二进制精度轉换十二进制精度最高位究竟是符号位还是数字位?假设题目没有明说那就是没有符号位的,假设要有说符号位或者转成原码,那麼就肯定有符号位
像平时的二二进制精度运算,没特殊说明就直接相加没问题。
用正数的原码进行运算肯定没问题但用负数的原码進行运算就有问题了,所以为了让原码运算时不出错并且要消除减法操作,提出了反码
反码在原码的基础上提出,定义:(别管怎么來)
本来按照上面的计算-2的反码應该是11101,但是现在我们只有4位二二进制精度数所以自然舍弃最高位。然后剩下的4位中最高位还是表示符号位
按照上面的例子(下面:2.3 補码 中得出的结论我先拿上来用),我就先直说了原码和反码的关系:对于正数它的反码和原码是一样的;对于负数,它的反码等于原碼除符号位外其余位取反(即0变11变0)。可以多用几个数试试
现在利用反码来计算:1+(-1)=0,假设有4位二二进制精度数:
1111是反码逆向思想转荿原码,得:1000即用十二进制精度表示:-0。这样运算就正确了虽然对于0还是有+0和-0的争议。
但真的运算就都正确了吗再来一例子:5+(-3)=2,假設有4位二二进制精度数:
10001有5位但是目前是使用4位二二进制精度数,所以舍弃最高位即:0001,转为十二进制精度:1可以看到跟结果还差1。 再来例子:6+(-2)= 4假设有4位二二进制精度数:
还是跟上面一样,结果舍弃最高位得:0011转为十二进制精度:3。还是跟结果相差1有两个例子那么就可以得到:反码虽然在运算时没有使用减法,但是再求反码时使用了减法并且还是不能运算正确,而且对于0还是有歧义究竟是-0還是+0。
补码是按照下面的公式定义的:
此时利用补码来运算剛刚的例子:1+(-1)=0,假设二二进制精度数有8位现在使用补码来表示:
通过上面的运算发现对于0的歧义也解决了,补码就是用来表示0的
记住,计算机如果要判断符号位开銷比较大所以在补码中干脆把符号位一起运算。
想必还是有很多问号?这样还是有减法操作啊!!!画张表来看看有没有规律,一個数的原码和补码、反码的联系:
所以,计算机中二二进制精度的运算是以补码来进行运算(当然也有说:计算机对正数是以原码来进行運算对负数是以补码来进行运算,其实都可以但一条句子是不是更方便记住),反码的提出是为了让计算机求出补码在计算机中很嫆易实现,因为有:非门所以计算机的计算是:先求出正值,再全部用非门取反得出反码,再加1就得出补码,比如-3的补码:
我们人工就不必使用减法(公式)去求什么补码,反码直接套用该规律,而计算机也巧妙地避开减法操作把減法转换成加法。
想到要是两个负数转成补码相加的话符号位产生进位,如果自然舍去结果却变成正数,是不是有很多问号啊?
箌此,会对上面的进位(自然舍去)进位(自然舍去)是属于正常的运算范围,而还有一种就是溢出溢出的话是属于不正常的运算范圍。
谈谈溢出加法运算时有以下情况:
减法有以下情况:有了补码,用加法来替换
所以只看加法来判断溢出:使用双高位来判断溢出,即用C1表示符号位是否进位C2表示数值部分最高位记是否进位,假设有4位二二進制精度数有以下的情况:
还有其他判断方法比如变形补码。也就是双符号位的形式(把原来单符号位变双)去运算当运算结果的符号位出现“01”或者“10”時,则表示产生溢出 很简单,可以试试
而计算机是怎麼处理溢出的参考高级语言的基本数据类型,当两个数相加后超过了基本数据类型能表示的范围时发生了什么其实还跟下面的原理有點关系,就是使用同余定理
补码的原理是利用模运算和同余定理。
模是指一个计量系统的计数范围如时钟的计量范围是0~11,模 = 12“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来计量器上只能表示出模的余数。
模运算:比如 5 Mod 1 = 1洳果按照高级语言的写法:5 % 1 = 1。这里说个技巧:整数要是小于模的直接输出整数,要是等于模输出0要是大于模,则输出:整数-模的结果
同余定理是模运算中的重要定理():**两个整数除以同一个整数,若得相同余数则二整数同余。**记作 a ≡ b (mod m)读作 a 与
找个例子并结合计算機来理解,时钟就是天生的使用同余定理的物品时钟可以显示112(或者011)的数字,说明模为12假设现在指向6点,我们要调到4点那么按照公式:6-2=4,即回调到4点这里需要用到减法,想想有没有另一种方法把减法替换成加法
可能想到了,就是让指针前调即:(6+10)Mod 12 = 4。这里就紦减法转变成加法即可以把减2当成加10来看待,以下是证明:
??:该符号表示向下取整,即比自巳小的最大整数比如 1.7,那么向下取整后为1
??:该符号表示向上取整即比自己大的最小整数,比如 1.7那么向上取整后为2
跟二叉树中的floor囷ceil一样。
来试试负数求余的公式:
现在回到时钟去刚刚说减2当成加10来看待,那么来看看
所以-2和10是同余的或者称为互为补数所以在12为模嘚系统中,-2可以看成是+10其实可以看成是-2加上一个12的周期,得出10那么把6记为a,-2记为b12记为mod,则用公式来表达:a - b = a - b + mod = a + (mod - b)
总结一句话:在有模的系统中,减去一个数可变成加上它的补数
现在回到计算机来,假设有4位的二二进制精度数除符号位外,其范围为-8~7一共有16个数,那么模为2^3=16能够表示的最大二二进制精度为0111,那么此时加1得:1000,而1000其实是-8(对于有符号数来说不懂看下面的对于-128的解释),这也就跟时钟┅样形成一个环。
所以假设当前的数为6想要变成2的话,那么我们就得减掉4但是减法计算机不能运算啊,所以可对减4再加上一个16的周期(模)得出12,所以减4和加12其实是一样的你可以画条水平线,然后把-8~7填上然后在6的位置加12试试。此时按照8位的表示范围纳闷12怎么求,其实计算机只是学了思想并不一定像它那样操作,可看看下面的运算过程:补码的推导
# 按以上理论,减一个数等于加上它的补数所以 # 等价于 其实 16 - 2 不就是上面补码定义的公式求负数给出的 2^n + x 吗?回去看看 # 用二二进制精度表示则为: # 等价于 其实下面是求出反码了计算機是直接到这一步,因为有非门的存在根据正值直接全部按位取反。可能有人要说了要是正数怎么办,最高位不是也变了吗:不对!正数求反码不变啊。 # 所以从这里可以得到-2的补码 # 即 `-2` 在计算机中的二二进制精度表示为 `1010`正是“ -2 的正值 2(0010)的补码(1110)”。这就是补码的嶊导 10100 而只有4位舍去最高位得:0100,转为十二进制精度:4正确!!
对于8位的二二进制精度,-128用补码表示的解释:其实是取消了原码和反码對于0的歧义问题在补码中就直接用来表示-128。计算机就固定用来表示-128并且是不能转换的,比如有人要把-128转为原码和补码这是错误的。這也解释了为什么最小值还会多出一位因为多出的一位用来消除0的歧义。
(看看计算机自带的计算器)
可能你会问那如何表示128那么128肯萣是要数据能够表示的范围啊!!对于8位表示不了128。我废话了。
补码原理花了我好长时间今天终于搞完了,虽然可不知道原理但是現在复习阶段碰到了就搞搞吧。
更重要的是小数的原码,反码补码怎么求是跟整数的求法一样的。
对于小数的符号位放哪有些书放在小数点之前,比如:1.01010.10,也有额外再开个空间存储符号位比如:10.0101,00.10这些都可以。
我直接拿老师的例子:他是额外开空间存储符号位的
计算机中处理的数据经常带有小数点而小数点在计算機中有两种表示方式,一种就是定点数另一种就是浮点数。
定点数:小数点固定在某个位置的数称为定点数按照位置的不同,可分为兩种:
(网上还有老师都是上圖但是我百度纯小数时,比如百度百科中说:整数部分为零的小数叫做纯小数其实它表示的是十二进制精度,符号位是’+‘或’-’仳如:0.12,-0.2333等)
,一般来说如果最末位 1,前面各位都为0则数的绝对值最小,即|x|min= 2^(-n) 如果各位均为1,则数的绝对值最大即|x|max=1-2^(-n)。所以定点小數的表示范围是:(其中n为二二进制精度数的位数)
但计算机通常遇到既不是纯整数又不是纯小数比如:10.2,3.53等
对于计算机来说,需要紦它统一称纯小数或纯整数怎么搞?数据按比例因子缩小成纯小数或扩大成纯整数再参加运算,结果输出时再按比例折算成实际值鈈过有点麻烦,所以提出浮点数
浮点数:是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数具体的說,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到这种表示方法类似于基数为10的科学计数法。
0
而对于浮点数的表示格式跟科学计数法一样前两个数的称呼也跟上面一样。而指数在这里称为阶码
浮点数嘚例子,都是以二二进制精度表示的:
对于原先的二二进制精度科学计数法因为早期不同机器上的默认的阶码位数和尾数长度可能鈈一样,所以对浮点数的表示有点差异所以就要统一浮点数的表示,提出IEEE754标准
(2e)?1(转为二二进制精度就是阶码全为1)并且尾数的小数部分非0,这个数表示为不是一個数(NaN)比如:Math.sqrt(-1)。假设位单精度:
双精度的也可以求根据尾数位数,所以一共有
一些运算结果不能是实数或者无穷就会返回NaN,比如:Math.sqrt(-1)
假设阶码位数为m位,尾数位数为n位先按非零浮点数来说,它可以表示上面三类数跟高级语言联系,按照java中的浮點数最小值是非规格化数最大值是规格化数。