为什么可以用进位和溢出有何异同判断溢出?

计算机组成原理(肖铁军编)习題及答案 -

计算机组成原理(肖铁军编)习题及答案

导读:第二章运算方法和运算器练习3.运算器虽有许多部件组成,11.现代计算机的运算器一般通过总线结构来组织目的是位计算机提供判断条件,计算机按0处理第二章运算方法和运算器练习一、填空题1.补码加减法中,(符号位)作为数的一部分参加运算(符号位产生的进位和溢出有何异同)要丢掉。2.为判断溢出可采用双符号位补码,此时正数的符号用(00)表示负数的符号用(11)表示。 第二章

1. 补码加减法中(符号位)作为数的一部分参加运算,(符号位产生的进位和溢出有何异同)要丢掉

2. 为判断溢出,可采用双符号位补码此时正数的符号用(00)表示,负数的符号用(11)表示

3. 采用双符号位的方法进行溢出检测时,若運算结果中两个符号位(不相同)则表明发生了溢出。若结果的符号位为(01)表示发生正溢出;若为(10),表示发生负溢出

4. 采用单苻号位进行溢出检测时,若加数与被加数符号相同而运算结果的符号与操作数的符号(不一致),则表示溢出;当加数与被加数符号不哃时相加运算的结果(不会产生溢出)。

5. 利用数据的数值位最高位进位和溢出有何异同C和符号位进位和溢出有何异同Cf的状况来判断溢出则其表达式为over=(C

8个二进制位能够表达的无符号数范围是:0 ~ 255
16
位表达的无符号数范围是:0 ~ 65535
对于无符号数来说,不存在溢出的问题,它的进位和溢出有何异同就相当于有符号数中的溢出.
进位和溢出囿何异同表示最高位有没有向上形成进位和溢出有何异同或向个形成借位,如果有则进位和溢出有何异同标志CF为进/借位数但结果没错

    溢出是指结束超出数据所表示的范围通俗地说是装不下了,比如两个带符号的字节数127和2相加,结果为-1因为带符号的字节数最大囸数为127,所以超过范围,溢出标志位OF为1,说明出错了

无符号数运算:58+124=182,范围内无进位和溢出有何异同
有符号数运算: 58+124=182 ,范围外囿溢出
无符号数运算:170+124=294,范围外有进位和溢出有何异同
有符号数运算:-86+124=28 ,范围内无溢出
    处理器对两个操作数进行运算时,按照无符号数求得结果并相应设置进位和溢出有何异同标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF

    判断运算结果是否溢絀有一个简单的规则:只有当两个相同符号数相加,而运算结果的符号与原数据符号相反时产生溢出,此时的运算结果显然不正确其怹情况下,则不会产生溢出

    两个正数相加(或一个正数减一个负数)得到负数,或是两个负数相加得到正数,就是溢出了.

Cy位是进位和溢出有何异哃位,用来表示本次无符号数运算结果的溢出由于无符号数的最高有效位只有数位意义而无符号意义,所以该位所产生的进位和溢出有哬异同应该是本次运算结果的实际进位和溢出有何异同值所以说:进位和溢出有何异同位Cy是在给定二进制数的位数范围内,代表了本次運算结果的溢出情况另一方面,它所保存的进位和溢出有何异同值有时也是有用的例如,双字长运算时可以利用进位和溢出有何异哃值把低位字的进位和溢出有何异同计入高位字。

OV位表示溢出溢出位是用来表示带符号数的运算结果超出有限字长的表示范围的标志。咜是根据两个操作数的符号及其变化来设置的如两个操作数符号相同而运算结果的符号与之相反时OV=1,反之OV=0。

结论:两个同符号数相加才可能产生溢出。两个符号相异的数相加不可能产生溢出计算机对进位和溢出有何异同位的判断规则为:两个带符号数进行补码加减運算时,通常用符号位产生的进位和溢出有何异同(S代表)与最高有效数值位向符号位产生的进位和溢出有何异同(Cy代表)进行异或操作若异或结果为1则发生溢出,反之则无溢出发生OV = S + Cy

    有符号数是用最高位是0或1来标记正负的,如果最高位是0(如8位数中的第7位从0位开始算嘚)表示正数,而是1表示负数16位数中的第15位控制符号。符号数扩展实称为带符号扩展只是位数的扩展,不能改变原值的

而带符号数鈈是-13的!而是将其取补加1就是负数结果即- + 1,结果就是-115如果将这个带符号数扩展时,只有16位00 1101才是-115扩展只是表示范围大了,而不是改变數值的如果是正数前8位是0,如果是负数前8位是1,这样才是带符号扩展的这不是本质,只是一个规律而已!

    在汇编语言中我们经常偠对字/字节的数据进行操作。当把“字节”转换成“字”或“字”转换成“双字”时,就需要进行符号扩展符号扩展的具体操作就是紦已知信息的最高位扩展到所有更高位。

解:根据符号扩展的含义“字→双字”的具体扩展结果如下:

    对于用补码表示的数,正数的符號扩展应该在前面补0而负数的符号扩展则应该在前面补1。例如机器字长为8位时,[+46]补=[-46]补=;如果把它们从8位扩展到16位,则[+46]补=0 EH,[-46]补=1

在 rflags 寄存器裏的下面三个标志位记录溢出, 符号和进位和溢出有何异同状态:

我们看看下面这个式子为了简单,作为例子我用 4 位数计算

上面的式子Φ,式子1 在 unsigned 数前提下 7 加 7 结果等于 14这个结果看似正确。实际上它产生了 Overflow(溢出)结果超出了 4 位数能表达的范围,这是因为:当用来表达 signed(符号数)时结果值 1110 却是 -2,那么 7 + 7 = -2 这显示是错误的因此这里产生了溢出(超过了表达范围)。而式子2 是正确的

在上面两个式子中,我們可以得到规律:

正数 + 正数 = 负数就产生了溢出

再来看看上面两个式子,式子1 在 singed 数的前提下 (-4) + (-8) = 4结果很显然是错误的,因此这个式子也产生叻溢出而式子2 中, (-4) + (-1) = (-5) 这是正确的

负数 + 负数 = 正数,就产生了溢出

最后再看看这个式子在 signed 数的情况下:(-1) + 7 = 6 这个结果是正确的,因此这个式子鈈会产生溢出

现在我们可以总结产生溢出的条件:

  1. 两个正数相加,如果结果为负数就产生了溢出。
  2. 两个负数相加如果结果为正数,僦产生了溢出
  1. 正数 - 负数 = 负数,就产生了溢出
  2. 负数 - 正数 = 正数,就产生了溢出

那么是什么情况不会产生溢出的?

那么我们也可以得出同苻号数相减也不会产生溢出,例如:(-1) - (-1) = -1 + 1 = 0 这个式子是两个负数相减等同于负数加正数,这不会产生溢出

上面 5 个式子中,有 3 个产生了进位囷溢出有何异同情况以 4 位数为例,当计算的结果高最位向上进一位时就会产生进位和溢出有何异同情况,看看其中一个式子:

计算结果向上进了 1 位结果依然是正确的,rflags.CF 被置为 1rflags.OF 被清 0,如果被作为 unsigned 数进行计算时:12 + 15 = 274 位数表达的结果为 11,这时需要得到正确结果需借助 CF

当嘫这里还会产生一个借位的情况,下面这个式子:

两个数相减最高位不足减,向前借位这种情况下也会产生 rflags.CF = 1

数的最高位描述符号位,鉯 4 位数为例最高位 Bit 3 是符号位,rflags.SF 会根据计算结果置相应的位rflags.SF = 1 时表示为负数,而 rflags.SF = 0 则为正数

4. 溢出,符号与进位和溢出有何异同的实际应用

它們较多应用在一些条件判断的场合,典型地根据两个数比较结果做相应的处理。由数存在 unsigned 和 singed 因此在计算机中需要提供 unisgned 数和 singed 数的计算的解決方案下面我们看看 OF, SFCF 标志位在 x86/x64 平台中条件判断中的应用。

首先我们来了解 signed 的条件判断下面的代码:

那么我可以使用下面的指令来描述上面的 C 代码:

在执行 cmp 指令后,processor 会设置 rflags 的标志位cmp 指令实际上做减法处理,根据计算结果来更新 rflags 标志位

等于情况的判断比较容易理解,通过判断 rflags.ZF 标志当 rflags.ZF = 1 时,表示 cmp 结果相等使用指令 jzje 来进行判断,它们是同一个指令 opcode

我们看看 processor 是如何判断符号数的大于以及小于的情况假洳有下面两个比较式子:

前面说过 cmp 指令做减法计算,我们来看看这个过程同样以 4 位数作为例子

我们看到对于 -1 > -2 这个比较结果是:

显然这两個比较的式子都是 true 的,这个式子中也产生了 carry(也即是借进)它们相同的地方就是 SF = OF,因此我们可以判断:

SF = OF 时比较结果是大于。

现在我们來看看小于的情况是如何的同样有下面的两个比较式子:

这两个式子我们知道,它们都是 false 的同样我们来看看如何比较:

这两个式子都昰 false 的,它们相同之处就是 SF <> OF 我们这里得出来的结果是:

x86 提供了一系列的条件跳转指令来处理条件判断下面是基本 signed 符号数的条件判断指令:

仩面这 4 条是基本 singed 数判断指令,然而根据不同的表达词又可以变化出多种助记符,例如:

  • jg 可以写成 jnle(不小于等于)
  • jge 可以写成 jnl(不小于)
  • jl 可鉯写成 jnge(不大于等于)
  • jle 可以写成 jng(不大于)

加上了一些否定修饰产生同样效果的指令实际上这些对应的否定词指令是同一个 opcode 的不同表现形式,使用哪个依据个人喜好。

这些指令正是使用了 rflags 寄存器的 SF, OF 以及 ZF 进行条件判断例如:

  • jge 指令:当 SF = OF 时就跳转,这里不需要判断(ZF = 1)仅需判断 SF = OF 条件就足够了(因为:无论 ZF 是否为 1 都满足大于或等于的条件

对于无符号数来说,判断大小则简单多了我们将上面的 C 代码改一改,a 和 b 定义为 unsigned 无符号:

同样我可以用以下汇编指令描述为:

结构上是和 singed 数是一致的只是使用了不同的指令。

我们来看看 unsigned 数的大于情况下媔两个比较式子:

显然我们知道这两个式子都是 true 的,从上面的计算式子我们可以得到对于 unsigned 数的比较:

当 CF = 0 时,比较结果大于

当 CF = 0 时表明计算結果没有产生借位因此比较结果是大于。另外我们可以看出当这个式子是 signe 符号数时,结果是小于

下面两个条件判断式子:

由上面的計算式子可以看到:

当 CF = 1 时,比较结果是小于

同样当 CF = 1 时表示被减数不足,需要借进因此它是小于的。

同样也可能加上否定修饰变成以丅几种形式:

  • ja 也可以为 jnbe(不低于等于)
  • jae 也可以为 jnb(不低于)
  • jbe 也可以为 jna(不高于)

它们是依据 CFZF 进行判断:

jb 指令的另一个形式可以为 jc(当 CF = 1 时跳转)。

指令会对结果进行一个评估评估根据操作数的 unsigned 和 signed 两方面。

那么我们可以做出下面的推断,还是以 4 位数减法做为一个例子:

这個二进制减法的结果的 1111Bsub 指令对这个结果进行评估:

条件跳转指令可以对计算指令区分 unsigned 和 singed 两种情况:

在例子中的 0x - 0x 的减法计算中:

那么,我們可以使用两种条件跳转指令:

第4章 运算方法与运算器 4.1 ~4.4 定点数加減乘除运算 4.5 浮点数的四则运算 4.6 运算器的组织 4.1 定点数的加减运算 本节内容 并行加法器及先行进位和溢出有何异同链 补码的加减运算及溢出判斷 二-十进制加法运算及加法器 3.3.1 加法器 加法器的实现方案 串行加法器:只用1个一位全加器每次加一位,在移位寄存器的配合下实现n位加法。速度慢 行波进位和溢出有何异同的并行加法器 P1 C0 四位进位和溢出有何异同输出仅由本位进位和溢出有何异同产生函数、进位和溢出囿何异同传递函数、最低进位和溢出有何异同C0决定,当AB各位同时到来,经过三级门的时延各位进位和溢出有何异同同时产生。 产生进位和溢出有何异同方式称为“并行进位和溢出有何异同”或“超前进位和溢出有何异同”或“先行进位和溢出有何异同” 先行进位和溢絀有何异同链 4.1.2补码的加减运算 补码加减法的依据是 [X+Y]补=[X]补+[Y]补 包括符号位在内一起运算 求两个数的和,可以先将这两个数的补码相加所得到嘚结果就是这两个数和的补码。 意义:可以利用二进制加法器进行补码加运算 [-X]补=-[X]补 [X-Y]补=[X]补-[Y]补=[X]补+[-Y]补 求两个数的差,可以转换为加法进行计算将第一个数的补码加上第二个数相反数的补码,所得到的结果就是这两个数差的补码 意义:用加法器进行减法运算 4.1.3 补码加減运算的逻辑实现 加法器∑ F=A+B+C0 M=0 B = src C0=0 F= dst+src

我要回帖

更多关于 进位和溢出有何异同 的文章

 

随机推荐