【计算机组成原理】【考试速通】第二章数据的运算和表示

进制转换

很简单,不写了。

定点数编码

定点数指小数点不会移动,浮点数则是小数点会移动位置。

四种编码

原码:一位数字表示符号,符号位0为正数,1为负数。因此原码的0有两种表示方法,即00000000和10000000(假设为8位)。原码的符号位只表示正负,不参与运算
反码:一位数字表示符号,符号位0为正数,1为负数。符号位=0时,反码等于原码。符号位为1时,数值位与原码相反。(其实没啥用)
补码:有符号整数一般用补码,一位数字表示符号,符号位0为正数,1为负数。符号位=0时,补码等于原码。符号位为1时,原码数值位取反再加一就是补码(或者反码加1)。
补码的符号位参与运算。符号位=0时即为0,符号位为1时为-2^n,例如8位补码10000000就是-128,10000001就是-127(-128+1)
特殊性质:由于负数的补码先取反再加一,故从右向左数第一个1(包括这个1)的右边和原码一样(因为+1),左边(不包括这个1)和反码一样(因为取反)。如下图:
在这里插入图片描述
【例题】
在这里插入图片描述
【选B】即10000011,最小一定是符号位为1,剩下的一代表的值越小越好。
在这里插入图片描述
【选B】,补码范围为-2^n ~ 2^n-1,最小为10000000,最大为01111111(8bit的情况)。
移码:一位数字表示符号,符号位0为正数,1为负数。补码的符号位取反就是移码。移码和浮点数的阶码相关。
在这里插入图片描述
【例题】
在这里插入图片描述
【选B】从上图即可得出结论。记住移码是补码符号位取反,且要溢出只能x=-128,故补码为10000000,移码就是00000000.

定点数运算

移位运算

算数移位

前提:

  1. 在不溢出的情况下,左移相当于乘2,右移是除以2.
  2. 算数移位不论左移右移,都不带着符号位移动,即只是数值位移动。

具体操作:

  1. 对于正数,原、反和补码均相同,无论左右移动都是补0,这也因为这三种码在正数时均相同。对于正数的溢出,三种码也相同。实际上正数的溢出完全可以看真值,真值超出表示范围即溢出。
类型移动前(真值为2)左移(真值为4)右移(真值为1)
0000 00100000 01000000 0001
0000 00100000 01000000 0001
0000 00100000 01000000 0001
  1. 对于负数,原码补0,反码补1。而由于补码的特殊性质,即右数第一个1右边和原码一样,左边和反码一样,故左移就是原码被拓展,即补0,右移是反码被拓展,补1.下图为示例。由于补码和原码的表示范围不同,原码溢出时补码可能并不会溢出。
类型移动前(真值为-64)左移(真值为-128)右移(真值为-32)
1100 00001000 0000(溢出,原码为-0)1010 0000
1011 11111111 11111101 1111
1100 00001000 0000(补码负数比原码大1,未溢出)1110 0000

负数溢出的规则很多也很复杂,但其实没必要去找太多的规则,只要看真值在移位后是否出现了溢出或者丢失精度,就可以判断具体情况。

例一:
原码为1100 0000,真值为-64,左移就会出错(溢出)。原码为1100 0001,真值为-65,右移为1010 0000,真值为–32,即丢失精度(并不是出错,因为在计算机中-65/2就等于-32,只是0.5的精度被丢失了。
这也就是所谓的”原码左移丢一出错,右移丢一丢精度“

对于反码,与补码相反即可。在实际计算中可以转换为原码再看真值,看是否溢出或者丢失精度。

例二:
补码为1100 0000,真值为-64,左移为1000 0000真值为-128,没有出错。
补码为1010 0000,真值为-96,左移为1100 0000真值为-64,出错。
补码为1100 0000,真值为-64,右移为1110 0000真值为-32,没有出错。
补码为1100 0001,真值为-63,右移为1110 0000,真值为-32,丢失精度。
说明补码左移如果不出错,需要数值位最高位和符号位相同(为1),右移丢一会丢失精度。
其实上面的结论完全不需要记忆,还是看真值即可,不溢出则是正确的。-96再左移已经超出最大表示范围,则一定出错。

  1. 若左移时丢1,则会导致错误(例如上面的原码溢出)。右移时丢1,会丢失精度(右移是除以2,若最后一位为1,再右移会出现0.5,但在整数里无法表示,则会被丢失)。
    在这里插入图片描述
    【选D】一是正确的,反码和原码是对应的,反码负数丢0则原码是丢1,一定会出错。右移丢0即原码丢1,会影响精度。二也是正确的,见上面的例二。三也是正确的,双符号位只有低位参加。见下面内容。
逻辑移位

逻辑移位将操作数视为无符号数,故左右移位都是补0.

循环移位

循环移位分为两种,不带进位位和带进位位。循环移位的主要特点是,移出的数位又被移入数据中,而是否带进位则要看是否将进位标志位加入循环位移。例如,带进位位的循环左移,就是数据位连同进位标志位一起左移,数据的最高位移入进位标志位 CF,而进位位则依次移入数据的最低位。
在这里插入图片描述

加减运算

原码的加减运算十分复杂,一般不考。

操作方法
正+正(正-负)绝对值加法,可能溢出
负+负(负-正)绝对值加法,加符号,可能溢出
正+负(正-正,负-负)绝对值大的减去绝对值小的,再视情况加符号

补码加减法:都换成加法,且符号位参与运算,运算得到的结果位数不变,如果超出则丢弃。即:

【A+B】=【A】+【B】
【A-B】=【A】+【-B】

其实也可以直接看真值再计算,并判断是否溢出。例如下面这题,实际上不需要计算二进制位,直接看真值,15+24一定不会溢出,故直接写39的补码即可。15-24同理。如果要计算二进制位,就逢二进一即可(不溢出的话)
在这里插入图片描述
溢出的判断方式:至于是哪种溢出,依然可以写真值来判断。
在这里插入图片描述
(1)一位符号位表达式的意思是,如果为正数+正数或者负数+负数才可能溢出,因此是AB和AB的非。后面的S则是符号位,如果是负数+负数,则AB=1,结果为正数才是溢出,即S=0,故第一个式子是ABS非。正数+正数,则AB=0,结果为负数才是溢出,即S=1,故为AB非S。中间的加号表示两种有一种达成即可判断是溢出。
(2)双符号位在写的时候可以直接写两个符号位。原理其实也类似,正数符号位为0,负数为1,溢出则会使得符号位变化。
(3)一位符号位原理和双符号位其实也一样,不过是表示形式不同,导致硬件电路出现区别。

加法器

(1)一位全加器。进位表达式的意思是,若要产生进位,要么是AB均为1,即1+1可以产生进位,要么是AB中有一个1,进位位(Ci-1)也为1,这样1+1=0也会进位。一位全加器从名字就可以看出,只能进行一位二进制的加法,因此为了完成多个二进制位的加法,可以把全加器串联起来形成多位的全加器。
在这里插入图片描述
(2)串行全加器
在这里插入图片描述
串行全加器可以满足多位二进制位的相加,A+B实际上可以看作向量对应项相加,即A1+B1,进位结果送到下一个全加器在和A2B2进行运算。不难看出,整个串行全加器的时间消耗主要是在送进位位的过程上,因为计算S和C是使用电路进行,是很快速的。因此要设计一种并行的全加器。
(3)并行全加器
这里需要公式的推导:影响串行全加器速度的是传递进位位的时间,因此主要的分析点应当在进位位上。对于第二个进位位,有:

C2 = A2B2+(A2⊕B2)C1
C1 = A1B1+(A1⊕B1)C0
//因此可以合并同类项
C2 = A2B2+(A2⊕B2)(A1B1+(A1⊕B1)C0)

因此可以不断的这样推导下去,将每个C最终换成之和AiBi以及C0相关
我们设:Gi=AiBi,Pi=Ai⊕Bi(为了方便化简式子),那么就有:

C1 = G1+P1C0
C2 = G2+P2C1 = G2+P2*(G1+P1C0) = G2+P2G1+P2P1C0

以此类推,我们就依次设计电线即可:越高位的加法器的电路线越复杂,这从上面的推导可以理解。
在这里插入图片描述
但如果位数过多,高位加法器增加的电线数就会非常多,导致电路过于复杂。因此我们可以把这种设计分成一组四个,分成若干组即可。即达到了组间串行,组内并行的效果。那如果再把这些组用相同的方式并行,就可以得到组间并行,组内并行的电路了。
(4)对加法器的改进:
如果想要对有符号数进行运算,那就需要带上各种符号位,例如溢出位、符号标志位、进位/借位位、零标志位。
在这里插入图片描述
(5)算术逻辑单元ALU
这可以说是运算器必不可少的部分,后面很多电路的内容都需要ALU来支撑。加减乘除本质上都是加法运算,因此ALU本质上是一个带标志的加法器,也可以进行与或非的逻辑操作。
在这里插入图片描述

乘法运算

(1)原码乘法
原理
乘法说白了就是若干次加法列竖式。例如1011×1101,前者为A,后者为B,列竖式:
每次用B的最后一位乘A,将结果加入到ACC(累加寄存器)中,并将结果右移(因为下一次乘得的结果要比这次的结果高一位),如图所示,第一次是1×1101,第二次就是1×1101,第三次是0×1101,最后是1×1101,每次乘法解释都要将结果加入ACC并右移。其实就是在用计算机模拟乘法列竖式的过程。而符号位单独计算即可(使用异或)
在这里插入图片描述
实现上述过程的电路如下:和上面描述的列竖式的过程一一对应,被乘数寄存器X就是存储被乘数的位置,乘积寄存器P就是存储乘积的高位,而Y存储的是乘数。每次取Y的最后一位(或者说最低位)乘X内的被乘数,乘积结果的值加到P上,然后P和Y的值整体右移一位,P右移是因为乘法列竖式时,下一次运算的结果比当前的运算结果要高一位,而Y右移不仅是给P腾出空间,也是将下一次和被乘数做乘积的数更新。其实P和Y就是一个整体。
在这里插入图片描述
运行流程如图所示,分割线左边的是Y的内容,左边的四位是P中内容,丢失位则是在不断运算过程中,运算过的乘数。在手写计算时,首先要将两个原码写成双符号位,在进行n次加法后移位(n为位数)
在这里插入图片描述
(2)补码乘法运算
即所谓的booth算法,和原码乘法其实大致相同,不同的地方在于:(1)在n次的计算和移位后,最后再做一次加法。(2)在Y的在最后加上一个辅助位,具体加的内容要根据辅助位来判断。
规则如下
在这里插入图片描述
电路如下:
在这里插入图片描述

定点数的除法

这里说的一般是定点小数的除法,故被除数一定要小于除数,否则结果就会大于1,也就导致不是定点小数。
除法的原理也是列竖式,与乘法不同的则是除法是每次选择商0还是1。
除法的电路和乘法大致相同。其实电路基本都是一样的,不过是选择乘法或者除法,导致寄存器的含义发生变化。
在这里插入图片描述
(1)原码除法之恢复余数法
在Y中存储除数,R中存储被除数和余数。每一次Q的最后一位会先默认商1,用被除数减去除数,如果结果是负数(有电路进行判断)则会再加上除数的相反数,并且商0.如果结果为正数,则将R和Q的值一起左移。产生n位商后结束。符号位单独使用异或电路计算。
在这里插入图片描述(2)不恢复余数法即不用恢复余数,遇到负数商0即可。商0再左移后加的是除数的绝对值的补码即可。
在这里插入图片描述
(3)补码不恢复余数除法
(1)符号位参加运算,除数与被除数均用补码表示,商和余数也用补码表示。(2)若被除数与除数同号,则被除数减去除数;若被除数与除数异号,则被除数加上除数。
(3)若余数与除数同号,则商上 1,余数左移一位减去除数;若余数与除数异号,则商上0,余数左移一位加上除数。
(4)重复执行第3步操作 n次。
(5)若对商的精度没有特殊要求,则一般采用“末位恒置 1”法。
在这里插入图片描述
商为1.0101,余数位0.0111*2^(-4)

整数类型以及类型转换

short:2B,-32,768到32,767
int:4B,-2147483648到2147483647
char:8位无符号整数

  1. 有符号数和无符号数
    无论如何转化,其二进制编码均相同,因此只是计算机解释的方式不同。例如将short类型的x转换为unsigned short,长度没有变化,变化的只有计算机解释数据类型的方式。对于有符号数是补码,无符号数则是原码。
    在这里插入图片描述
  2. 不同字长的字符转换
    长->短,直接截断,解释方式看转换后的数据类型。如果是有符号数则为补码,否则为原码。
    在这里插入图片描述
    短->长:需要对新的数据进行高位拓展。如果是无符号数进行扩展,则高位补充0。如果为有符号数,则高位用符号位扩展。
    在这里插入图片描述

大端法、小端法和边界对齐

有一个很简单易懂的例子来形容大小端法:大端法更像现代人,书写都是从左向右写,而小端法是古代人,书写是从右向左写。但书写的方向并不改变字的构成,例如写“好”这个字,不论是古代人还是现代人都会写成“好”,而不是“子女“。
大端法就是从低地址向高地址写,而小端法是高地址向低地址写。
在这里插入图片描述
边界对齐:寻址可以按照字、半字或者字节寻址,如果存储字长为4B,那就可以按照下图左边的方式存储。这样的好处是存取指令方便,那对于流水线的适应也就更好。而右边的方式则会导致取一个半字可能分成两次。

在这里插入图片描述

浮点数及其运算

有浮点数的原因是如果只用定点数,再表示一些很大的数的时候会很麻烦,例如表示2^100这种数,会出现过长的位数,导致难以表示。因此可以考虑换成类似于科学计数法的方式,将一个大数分成:数符、阶码、尾数和基数。
在这里插入图片描述
其中数符S代表的是数字的正负。尾数M代表的是经过阶数处理后的数。相当于科学计数法中2.5*10^5中的2.5。基数R相当于科学计数法中的10,在浮点数中默认为2,阶码E相当于科学计数法中的5。因此浮点数可以用这几部分去表示很大的数字。
例如:0 10 01001 第一位0说明是正数,阶码10表示为2,即乘2^2,尾数为0.01001,则结果为0.01001*2^2即+1.001.

浮点数的规格化

若尾数的第一位为0这种无效位,则会导致精度的丢失。例如114514可以写成1.14514*10^5,也可以写成0.000114514*10^9,如果小数位数最多6位,就会变成0.000114*10^9,导致精度丢失。也不要出现大于10的数。
规格化的方法:若是最高位不是1,则需要左移,直到最高位为1。每次左移阶码需要减一(左移二进制位则相当于乘2,故要减一)。如果有效位到小数点之前,就需要右规,即尾数右移,阶码加一,直到第一个有效位在小数点的右边为止。

IEEE标准

下图是IEEE的浮点数标准,和前面的浮点数标准做区分,但含义和组成仍相同。IEEE标准的阶码是用移码进行表示,bias=2^(n-1)-1,例如8位阶码,bias则为127.
在这里插入图片描述
IEEE的浮点数除去阶码的表示和上面不同之外,其尾数前也加1,这是因为对于规格化的二进制浮点数,尾数的最高位总是1,故1就当作隐藏位,不写在尾数中,最后计算真值的时候加上1即可(前提是阶码不为全0、全1这种特殊情况)。
在这里插入图片描述
【例题】
(1)将十进制数(-0.75)转化为IEEE标准的单精度浮点数;
-0.75=-0.11,故数符为1。0.11左移后为1.1*2^-1,故尾数为100000…(因为最高的1被隐藏)。阶码为-1+bias=-1+127=126=0111 1110
故结果为:

1 01111110 1000000000000000000000

(2)IEEE单精度浮点数C0 A0 00 00 H真值为?
原值转换为二进制:
1 | 100 0000 1 | 010 0000 0000 0000 0000 0000
1代表是负数,阶码真值=1000 0001-0111 1111=2(移码计算直接当作无符号数相减即可)
故真值为-1.01*2^2=-101=-5.
(3)IEEE单精度能表示的最大、最小绝对值值为?(阶码不全为0和1)
最小:尾数为0,阶码为-126.最大:尾数全1,阶码为127。

阶码特殊值

在这里插入图片描述

浮点数运算

1)对阶
对阶的目的是使两个操作数的小数点位置对齐,即使得两个数的阶码相等。为此,先求阶差,然后以小阶向大阶看齐的原则,将阶码小的尾数右移一位(基数为 2),阶加 1,直到两个数的阶码相等为止。尾数右移时,舍弃掉有效位会产生误差,影响精度。
2)尾数求和
将对阶后的尾数按定点数加(减)运算规则运算。运算后的尾数不一定是规格化的,因此,浮点数的加减运算需要进一步进行规格化处理。
3)规格化
4)舍入
这是由于尾数有具体数量,故需要舍去超出的值。舍入的规则可以是(1)直接去掉多余的部分(2)如果去掉的是非零部分,则前一个数进一(3)四舍五入
5)判断溢出
阶码可能会超出所给位数,故需要判断是否溢出。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值