计算机组成原理第二章:数据的表示与运算

数制与编码

在这里插入图片描述
其中编码和校验码部分已经在考纲内删除了,可不用再关心。
在这里插入图片描述

数据的表示

二进制:

在这里插入图片描述

十六进制:

在这里插入图片描述
由此可推广一般化:
在这里插入图片描述

进制转换:

二进制转化为额其他进制:
二进制转化为八进制,每三个位看做一组,然后进行计算,不够三的倍数时添加0即可,二进制转十六进制同理。每四个看做一组即可。
在这里插入图片描述
十进制转化为其他进制:
整数部分::
小数部分:
在这里插入图片描述
快捷方法:
在这里插入图片描述

以上图的112.25为例,128肯定就大于了,不行,所以只能用64,然后112.25-64剩余58.25,不够64所以用32,以此类推,小数点部分一样的道理,没用到的地方就用0表示,用到的地方就用1表示,就能拿到二进制数值了。

真值和机器数

在这里插入图片描述

定点数的表示和运算

定点数的表示

在这里插入图片描述
在这里插入图片描述

无符号数

在这里插入图片描述
在这里插入图片描述
不会变少,如上图所示,一位拿来做符号位的话,那么我们只能表示2的7次方-1个数据,正数能表示这么多,负数也能表示这么多,那么合起来不就又是2的8次方-1吗,所以能表示的数据量并不会减少。另外还要注意,计算机的位数其实就是指的机器字长。
在这里插入图片描述
主要就是用于表示计算机内部的一些非负数值。

有符号数

在这里插入图片描述

有符号数定点表示(原码)

在这里插入图片描述

定点整数

在这里插入图片描述

定点小数

在这里插入图片描述

有符号数的定点表示(反码)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

有符号数的定点表示(补码)

在这里插入图片描述
上面的规定中,假设的是机器字长为八位,所以补码整数表示为了-2的7次方,但是如果机器字长为n位的话,就应该是-2的n次方,而补码小数则永远都是-1,没有区别。
在这里插入图片描述

有符号数的定点表示(移码)

在这里插入图片描述
为什么移码只有整数?因为之前介绍补码的时候已经说过了,不管机器字长多少,补码小数的表示范围为-1到1-2的-n次方,而-1已经由1.00000表示了,同时移码又是建立在补码基础上的,就是将补码的符号位取反,那么唯一的一个负数-1都被取反变成正1了,所以显而易见,移码则只能表示整数了。
在这里插入图片描述
在这里插入图片描述

总结

在这里插入图片描述

定点数的运算

移位运算(算数移位最常考)

算术移位(原码)在这里插入图片描述

丢失精度什么意思?比如上图中提到的,当我们将9继续算数右移一位,可以看见低位移出去了一个1,这就意味着9又除以了2,现实生活中应该等于4.5,但是因为丢弃未不等于0,丢失了0.5的精度就变成了4。
在这里插入图片描述
出现严重错误怎么理解?上图中真值为72当它继续左移时,会发现高位的1会被丢弃(因为已经超过了机器字长所能表示的最大位数),所以计算剩余的值为16,被丢弃的1的权重应该为2的7次方即128,然后再加上现在还剩的16为144,这才是我们正好应该72*2所得到的值,但因为1被丢弃了所以只剩16了,即严重的精度缺失。

算数移位(反码)

在这里插入图片描述
负数反码的移位运算高低位补1是因为反码是由原码符号位不动数值位按位取反得来的,所以在负数反码高低位补的1就是原来原码上的0。

算数移位(补码)

在这里插入图片描述

总结

在这里插入图片描述

逻辑移位(最简单的一种)

在这里插入图片描述

循环移位

带进位循环移位:
在这里插入图片描述
移位过后如下:
就相当于走了一个循环,右移就是最右边的数值位移到CF里面,然后CF里面的值再填充到字长里面即可,左移同理。
在这里插入图片描述

不带进位循环移位:
注意:移动位就是指字长里面需要被移出的那个数值就叫移动位。
在这里插入图片描述

大概过程是:
先不看CF位,字长里面先进行一次循环移位,然后CF位再记录下来移动位的那个数值即可:
在这里插入图片描述
总结一下:
在这里插入图片描述

加减法运算

原码加减法

加法器直接对原码进行计算可能会出错:
在这里插入图片描述
所以需要采取一定的规则:
在这里插入图片描述
即:
在这里插入图片描述
在这里插入图片描述

之前的错误例子改正后即:
在这里插入图片描述

补码加减法

在这里插入图片描述
在这里插入图片描述
对于补码来说,无论加法还是减法最后都会转化为加法,由加法器实现运算,符号位也参与运算。
在这里插入图片描述

移码加减法(不考,了解即可)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

溢出判断

在这里插入图片描述

1)符号比较法

在这里插入图片描述

2)双进位法

在这里插入图片描述
可以发现上述中的例子左边部分为上溢出,右边部分没有溢出。

3)双符号位法

在这里插入图片描述

符号拓展

在这里插入图片描述

乘除法运算(难,考的不多)

在这里插入图片描述

原码一位乘

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
两个数一正一负,按照概念中说的,我们始终将MQ中的乘数看成正数来计算,在最后得出结果时再来进行正负的判断。
由上图可知,乘数最低位为1,我们将部分积加上我们的被乘数,得到01101存入我们的ACC寄存器中:
在这里插入图片描述
然后接下来采用类似的操作,但是乘数最低位因为已经用过了,所以进行逻辑右移,ACC的符号位不动,最高位顺下右移补0,所以最低位的值就右移至MQ的高位,而MQ的低位就被抛弃了。然后再进行重复的加操作,ACC+X:
在这里插入图片描述
再进行逻辑右移,可以发现此时MQ寄存器中的最低位为0,所以让ACC寄存器+0即可:
在这里插入图片描述

接下来都是如法炮制,因为乘数4位。所以进行4次操作之后就已经拿到结果了:
在这里插入图片描述
最后ACC中的内容就是最终结果的高位,MQ中的内容就是最终结果的低位:
在这里插入图片描述
最后结果的符号单独处理:
在这里插入图片描述
在试卷上用下面的方法更方便:
在这里插入图片描述

在这里插入图片描述

补码一位乘

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原码一位除(考的少)

在这里插入图片描述
计算机中怎么实现这个过程呢?有两种方式:一是恢复余数法,二是加减交替法,这里先讲第一种:

恢复余数法

同样是需要ACC、MQ寄存器和ALU处理器来实现:
在这里插入图片描述
在我们手动计算中,我们自己会认为01011比01101小,所以会先补一个0,但是计算机不知道,所以计算机在进行运算时第一次上商一定是先上1,上1了之后再进行一个判断:
在这里插入图片描述
现在计算机知道了01011+10011的结果(作减法的结果)是小于0的,是负数,那么接下来肯定就不能进行运算了,所以现在我们又恢复这个除数,并且把第一次上商的1改成0,ACC里面的被除数也恢复回01011:
在这里插入图片描述

然后我们对ACC和MQ进行左移,这样ACC的最高位0就被丢弃了,然后ACC内容变成10110,对于MQ也要左移,但是记得在每次进行除法前我们都要先让计算机默认商1,当商1的结果为正数时,才能继续正常除法。
在这里插入图片描述
可以看到这一次的结果是个正值,那么说明我们刚刚的商1是正确的,所以我们更新ACC里的值为01001,MQ里面的商1的值也保留。现在我们又将ACC和MQ左移一位:
在这里插入图片描述
然后过程类似,又是先通过默认商1来判断是否能够继续进行,能则留下该商1然后更新ACC,左移继续操作;不能则继续左移即可。
在这里插入图片描述
重复这个操作直到最后,得到答案:
在这里插入图片描述
在这里插入图片描述

加减交替法

在这里插入图片描述
在这里插入图片描述

补码一位除(和原码一位除差不多)

在这里插入图片描述
在这里插入图片描述

浮点数的表示和运算

在这里插入图片描述

一般浮点数的表示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

IEEE 754标准

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

浮点数运算

浮点数加减运算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

浮点数乘除法(考纲未要求,了解就好)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

加餐内容(感兴趣可以看看,关于硬件的东西)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### 双符号位的概念及其在计算机科学中的应用 在计算机系统中,为了有效检测溢出情况并简化某些类型的运算逻辑,引入了双符号位机制。当采用补码表示法时,通常情况下仅需一位用于标记正负性质;但在特定场景下增加至两位,则能提供额外的信息支持。 #### 补码体系下的双符号位设计 对于有符号整数而言,在标准的二进制补码编码方案里,最高有效位被指定为单个符号位——'0'代表正值而'1'则对应于负值。然而,通过扩展到两个连续高位作为联合符号域,可以构建一种增强型的数据结构[^3]: - **正常范围内的数值**:前两比特均为`00`或`11`,分别指示非负非正状态; - **发生溢出的情形**:如果加法操作导致结果超出可表达区间,则最终形成的串首会出现混合模式即`01`(原本应为全零却因超界变为一正一负) 或者 `10`(同理由纯负转成部分正向),从而直观反映出异常状况的发生。 这种策略不仅有助于即时识别潜在错误,而且便于硬件层面实施相应的控制措施以应对非法输出。 ```c++ // C++ code snippet demonstrating double sign bit check during addition #include <iostream> using namespace std; bool hasOverflow(int a, int b){ unsigned char sa = (a >> 31); // Extract single sign bits of operands unsigned char sb = (b >> 31); long sum = static_cast<long>(a) + b; unsigned char ss = (sum >> 31); // Check for overflow using double sign concept bool isPositiveA = !sa && !sb; bool isNegativeA = sa && sb; bool mixedSignsResult = ((ss != sa) || (ss != sb)); return !(isPositiveA || isNegativeA) && mixedSignsResult; } int main(){ cout << "Checking Overflow with Double Sign Bits:" << endl; int num1=-5,num2=7; if(hasOverflow(num1,num2)){ cout<<"An overflow occurred."<<endl; }else{ cout<<"No overflow detected."<<endl; } } ``` 上述程序片段展示了如何基于双符号位原则编写函数来判定是否存在溢出现象。此方法特别适用于那些依赖精确算术行为的应用场合,比如编译器优化、嵌入式控制系统等领域内。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在地球迷路的怪兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值