补码溢出的几种方法 即结果表示~!

作者&投稿:畅怎 (若有异议请与网页底部的电邮联系)
补码运算中,常用检查溢出的方法有哪三种~

溢出判断方法一
  用Xf和Yf表示被加数和加数补码的符号位,Zf为补码和的符号位.当出现Xf = Yf= 0两数同为正,而Zf为负,即Zf=1时,有上溢.当出现Xf =Yf = 1两数同为负,而Zf为正,即Zf= 0时,有下溢.
溢出判断方法二
  当数值最高位有进位位C1=1,符号位没有进位C0=0时,或当数值最高位没有进位位C1=0,符号位有进位C0=1时,结果有溢出.
溢出判断方法三:
用变形补码进行双符号位运算.在变形补码中,正数符号以"00"表示,负数的符号以"11"表示.一般称左边的符号位为第一符号位,右边的符号位为第二符号位.若运算结果的符号位为"01",则表明有正溢出产生.若运算结果的符号"10",则表明有负溢出产生.

对于加法来说,操作数符号可能是:
1. [正] + [正]2. [正] + [负]3. [负] + [正]4. [负] + [负]
对于减法来说:
1. [正] - [正] 相当于加法里的(2)2. [正] - [负] 相当于加法里的(1)3. [负] - [正] 相当于加法里的(4)4. [负] - [负] 相当于加法里的(3)
加法里,哪种操作会溢出?
对于一个有N位二进制的补码,其能表示的数字的范围是:
-2^(N-1) ~ +2^(N-1)-1
负数:-2^(N-1) 到 -1正数:1 到 2^(N-1)-1
那么对于加法来说:
“[正] + [负]”或者“[负] + [正]”永远都不会溢出,不管两个操作数取值多少,结果都落在有效范围内。
而超出有效范围的两种可能性就是:1. [正] + [正]2. [负] + [负]
那么再看这两种操作如果超出范围的话,表现形式是什么样的:
定义两个事件:
1. 最高有效位进位:对于N位补码,第N-1位发生了进位;2. 符号位进位:对于N位补码,第N位符号位发生;
定义4个边界值,以8位有效字长为例:最大正127 (0111 1111)最小正1 (0000 0001)最小负-128(1000 0000)最大负-1 (1111 1111)
列出所有组合(消除交换律重复)
符号位 最高有效位 是否发生溢出 最高有效位进位 符号位进位[最小正] + [最小正] 0 0 0 0 N N N[最小正] + [最大正] 0 0 0 1 Y Y N[最小正] + [最小负] 0 1 0 0 N N N[最小正] + [最大负] 0 1 0 1 N Y Y[最大正] + [最大正] 0 0 1 1 Y Y N[最大正] + [最小负] 0 1 1 0 N N N[最大正] + [最大负] 0 1 1 1 N Y Y[最小负] + [最小负] 1 1 0 0 Y N Y[最小负] + [最大负] 1 1 1 0 Y N Y[最大负] + [最大负] 1 1 1 1 N Y Y
所以,从规律上看凡是发生溢出操作,“最高有效位进位”和“符号位进位”必然是一个是Y另一个是N,凡是不发生溢出的操作,必然是两个全Y或者两个全N
这就是根据最高有效位和符号位发生进位的异或来判断是否溢出规律。
下面是逻辑证明环节,很绕,证明方法很简单,就是把几种条件都列出来判断一下即可:
[正]+[正]溢出,因为两个都是正整数,所以符号位都是0,溢出时最高位发生了进位,但因为符号位是0,0加上进位的1是永远不会发生进位的。所以对于前面定义的两个事件:“最高有效位进位”发生了,“符号位进位”未发生。
[正]+[负]不溢出时,此时设正数范围包括0:
如果结果为负整数,因为第二个操作数的符号位是1,结果的符号位也是1,那么“符号位进位”未发生,同时“最高有效位进位”也未发生。因为如果发生了,会产生一个进位1,与符号位1相加会倒是符号位变化,而此时符号位是不变的,所以可以肯定两个事件都没有发生。
如果结果为正整数,那么必然同时发生了“最高有效位进位”和符号位进位”,因为第二个操作数的符号位是1,但结果符号位是0,所以符号位有进位(1 + 0 + X = 10)。而第一个操作数的符号位又是0,所以必然是最高有效位产生了一位进位才让符号位获得了一个1才能进位,对于符号位的计算来说[正]符号位0 + [负]符号位1 + 最高有效位进位X = 10,X必然是1
[负]+[负]溢出,因为两个都是负整数,所以符号位都是1,溢出时符号位发生了进位(两个都是1)。再看最高有效位是否有进位,对于8位的负数加法来说,产生溢出,意味着结果范围在-129~-256之间,这个范围内的二进制数,以9位补码来看,就是1 0111 1111到1 0000 0000,那么这两个数如果减掉符号位相加的1 0000 0000的话,得到的结果就是 0111 1111到0000 0000,这个范围内的数字第8位都是0,所以从符号位的计算可以得知[负]符号位1 + [负]符号位1 + 最高有效位进位X = 10,最高有效位的进位值必然是0,所以最高有效位必然没有发生进位。
参考资料
知乎:https://www.zhihu.com/question/22199029?sort=created

采用补码双符号位表示
两个数相加后:双符号位:00--结果为正,无溢出
01--结果正溢(算结果的时候,只把最高位当符号位,那么这个1就算如数值)
10--结过负溢(既然为负,那么就求它的原码,(1不变,0变成1),求出数值)11--结果为负,无溢出.(求它的原码,(11不变),得到数值)

补码溢出的几种方法,即结果表示溢出

人工计算,如果结果不正确,即表示:溢出

CPU 计算,如果 OF=1,即表示:溢出




顺义区17356134030: 补码溢出的几种方法 即结果表示~ -
韶德黛卫:[答案] 采用补码双符号位表示 两个数相加后:双符号位:00--结果为正,无溢出 01--结果正溢(算结果的时候,只把最高位当符号位,那么这个1就算如数值) 10--结过负溢(既然为负,那么就求它的原码,(1不变,0变成1),求出数值)11--结果为负,...

顺义区17356134030: 补码加法中,如果不采用双符号位加法,怎样判断运算结果是否溢出 -
韶德黛卫: 补码加法运算溢出判断三种方法:[方法一] Xf、Yf分别两个数符号位,Zf为运算结果符号位.当Xf =Yf =0(两数同为正),而Zf=1(结果为负)时,负溢出;当出现Xf =Yf =1(两数同为负),而Zf=0(结果为正),正溢出.[方法二] Cs表示符号位的进位,Cp表示最高数值位进位,⊕表示异或.若 Cs⊕Cp =0 ,无溢出;若 Cs⊕Cp =1 ,有溢出.[方法三] 用变形补码进行双符号位运算(略)

顺义区17356134030: 补码溢出详解 -
韶德黛卫: 简言之就是两个同号数相加超出所能表示最大范围,得到结果符号相反

顺义区17356134030: 补码相加溢出问题 -
韶德黛卫: 先一步步来 8位的-29的二进制原码10011101 反码11100010 补码11100011 -25的原码10011001 反码11100110 补码11100111 然后就是两个数的补码相加11100011+11100111得11001010 这个结果也是反码 化成原码就是减1再取反得10110110 最高位是符号位所以化成10进制就是-54 就是这么得来的.计算时都要溢出的 否则计算就会错误 补码也就没意义了 所以希望你能懂溢出的原因!

顺义区17356134030: 如何确定由两个补码表示的有符号数在做加减法运算时产生溢出? -
韶德黛卫: 补码加法运算溢出判断三种方法:1. Xf、Yf分别两个数的符号位,Zf为运算结果符号位.当Xf =Yf =0(两数同为正),而Zf=1(结果为负)时,负溢出;当出现Xf =Yf =1(两数同为负),而Zf=0(结果为正),正溢出. 2. Cs表示符号位的进位...

顺义区17356134030: 二进制补码溢出的判断方法,如 -
韶德黛卫: t=a-b=a+(-b) 用-b代入你的条件中.

顺义区17356134030: 如何检查补码加减运算中的溢出问题? -
韶德黛卫:[答案] 通常有三种表述方式(说法): (1) 两个符号相同的补码数相加,如果和的符号与加数的符号相反,或两个符号相反的补码数相减,差的符号与减数的符号相同,都属于运算结果溢出.这种判别方法比较复杂,要区别加还是减两种不同运算情况,...

顺义区17356134030: 怎样根据运算数和结果的符号状态判断补码运算溢出
韶德黛卫: 如果两正数相加结果为负,或者,两负数相加结果为正,就是产生了溢出. 具体的运算过程就是:两个符号位为0的数相加,结果的符号位是1;或者,两个符号位为1的数相加,结果的符号位是0,就可判断产生溢出了.

顺义区17356134030: 如何判断是否溢出?
韶德黛卫: 1.符号位判定,两个相同符号的数相加后,结果与两个加数一致 2.最高位的进位判定,两个正数相加,最高有效位有进位,符号位无进位. 两个负数相加,最高有效位无进位,而符号位有进位. 3.采用变形补码法,正数前加0负数前加1,运算后,两符号不一致,则溢出.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网