百度
360搜索
搜狗搜索

补码运算溢出的条件是参加运算的两个操作数的符号位,计算机补码运算的溢出叛别方法?详细介绍

本文目录一览: 如何确定由两个补码表示的有符号数在做加减法运算时产生溢出?

溢出,是指数据的大小,超出了编码所能表示的范围。
不仅是补码计算,任何形式的计算,都可能产生溢出。
比如:1999 年、2000 年 ...,这是用 4 位十进制表示。
当到了 9999 年,再过一年,你如果还用 4 位表示,就会溢出了。
在计算机中的一个字节,是 8 位 2 进制数。
如果是无符号数(一般二进制数),就只能代表:0 ~ 255。
如果是带符号数(补码),就可以代表:-128 ~ +127。
当你的运算结果,超出了范围,就会溢出。
--------------------
比如,一次运算如下:
  0111 1111 + 0000 0010 = (0) 1000 0001。
  无符号数运算,是 127 + 2 = 129,没有溢出,进位为 0。
  有符号数运算,是 +127 + 2 = +129,超出范围,溢出。
    此时,八位的结果,代表-127。 和的符号错误。
溢出的表现:
  无符号数溢出,进位为 1。
  带符号数溢出,结果的符号有错。
--------------------
如何检查补码加减运算中的溢出?
这很简单。
一、如果不是“正+正、负+负、正-负、负-正”,肯定就不会溢出。
二、用十进制数,进行人工计算,结果超出范围,就是溢出。
三、用二进制数,进行人工计算,结果符号有错,就是溢出。
另外还有一种“两个进位异或”的判断方法。
这种方法,是计算机内部硬件所用的。
硬件的理论,是很难懂的。
异或,怎么就能导出溢出,理论何在?
书上也没有介绍。 显然,老师都不知道是怎么回事!
但是,有些老师,就是爱得瑟,专爱讲这种没头没脑的方法,以示高深。
补码加法运算溢出判断三种方法:
Xf、Yf分别两个数的符号位,Zf为运算结果符号位。当Xf =Yf =0(两数同为正),而Zf=1(结果为负)时,负溢出;当出现Xf =Yf =1(两数同为负),而Zf=0(结果为正),正溢出。
Cs表示符号位的进位,Cp表示最高数值位进位,_表示异或。若 Cs_Cp =0 ,无溢出;若 Cs_Cp =1 ,有溢出。
用变形补码进行双符号位运算(正数符为00,负数符号以11)。若运算结果的符号位为"01",则正溢;若结果双符号为10,则负溢出;若结果的双符号位为00或11,无溢出。
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

什么是补码加减运算溢出,判别溢出有哪几种方法,说明工作原理是什么?

对于加法来说,操作数符号可能是:
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
溢出,是指数据的大小,超出了编码所能表示的范围。
 
不仅是补码运算,任何形式的运算,都可能产生溢出。
比如:1999 年、2000 年 ...,这是用四位十进制表示。
当到了 9999 年,再过一年,你如果还用四位表示,这就溢出了。
 
字长为 8 位二进制,补码的范围是-128 至+127。
那么,+125 + 4 = +129,这就溢出了。
溢出,是通用的词汇,其含义,还是很容易理解的。
在计算机中,溢出,专用来说明:“补码运算结果超出预定的范围”。
八位的二进制,作为补码,其表示范围是:-128 ~ +127。
示意图如下:
当你的运算结果,小于-128 时,就会落入 +127 下面的范围,成为正数。
当你的运算结果,大于+127 时,就会落入-128 上面的范围,成为负数。
根据这些表现,你就可以找到两种“判别溢出”的方法。
一、两个数值相加,和,超出了-128~+127,必然就溢出。
二、两个补码相加,和的符号,不符合正常的逻辑关系,这就是溢出了。
另外,你还可以根据 OF 的值,来判断是否溢出。
此外,还有“在二进制运算过程中“进行判断的方法。
  这方法,是由 CPU 在内部实现的,判断的结果,即在 OF 上给出。
  作为人类,掌握这种方法,并无实际意义。

如何检查补码加减运算中的溢出问题?

溢出,是指数据的大小,超出了编码所能表示的范围。
不仅是补码计算,任何形式的计算,都可能产生溢出。
比如:1999 年、2000 年 ...,这是用 4 位十进制表示。
当到了 9999 年,再过一年,你如果还用 4 位表示,就会溢出了。
在计算机中的一个字节,是 8 位 2 进制数。
如果是无符号数(一般二进制数),就只能代表:0 ~ 255。
如果是带符号数(补码),就可以代表:-128 ~ +127。
当你的运算结果,超出了范围,就会溢出。
--------------------
比如,一次运算如下:
  0111 1111 + 0000 0010 = (0) 1000 0001。
  无符号数运算,是 127 + 2 = 129,没有溢出,进位为 0。
  有符号数运算,是 +127 + 2 = +129,超出范围,溢出。
    此时,八位的结果,代表-127。 和的符号错误。
溢出的表现:
  无符号数溢出,进位为 1。
  带符号数溢出,结果的符号有错。
--------------------
如何检查补码加减运算中的溢出?
这很简单。
一、如果不是“正+正、负+负、正-负、负-正”,肯定就不会溢出。
二、用十进制数,进行人工计算,结果超出范围,就是溢出。
三、用二进制数,进行人工计算,结果符号有错,就是溢出。
另外还有一种“两个进位异或”的判断方法。
这种方法,是计算机内部硬件所用的。
硬件的理论,是很难懂的。
异或,怎么就能导出溢出,理论何在?
书上也没有介绍。 显然,老师都不知道是怎么回事!
但是,有些老师,就是爱得瑟,专爱讲这种没头没脑的方法。
通常有三种表述方式(说法):
(1) 两个符号相同的补码数相加,如果和的符号与加数的符号相反,或两个符号相反的补码数相减,差的符号与减数的符号相同,都属于运算结果溢出.这种判别方法比较复杂,要区别加还是减两种不同运算情况,还要检查结果的符号与其中一个操作数的符号的同异,故很少使用;
(2) 两个补码数相加减时,若最高数值位向符号位送的进位值与符号位送向更高位的进位值不相同,也是运算结果溢出.
(3) 在采用双符号位(如定点小数的模4补码)运算时,若两个符号位的得值不同(01或10)则是溢出.01表明两个正数相加,结果大于机器所能表示的最大正数,称为"上溢";10表明两个负数相加,结果小于机器所能表示的最小负数,称为"下溢";双符号位的高位符号位,不管结果溢出否,均是运算结果正确的符号位,这个结论在乘法运算过程中是很有实际意义的.请注意,在采用双符号位的方案中,在寄存器和内存储器存储数据时,只需存一位符号,双符号位仅用在加法器线路部分.
再次强调,这三种不同说法是对同一个事实的略有区别的表述,实现时用到的线路可以有所区别,但问题的实质是完全一样的.

阅读更多 >>>  计算机的每秒计算次数是什么概念

怎样根据运算数和结果的符号状态判断补码运算溢出

如果两正数相加结果为负,或者,两负数相加结果为正,就是产生了溢出。
具体的运算过程就是:两个符号位为0的数相加,结果的符号位是1;或者,两个符号位为1的数相加,结果的符号位是0,就可判断产生溢出了。

计算机补码运算的溢出叛别方法?

回答:溢出了.如果题目直接给的数字,那么你直接计算开是否超出正127或者负128就可以了.
当然,如果你想用计算机那种方法来判断也是可以的,把两个数字转换成二进制
发现相加有进位(减法需要事先变成加法),而且两个数字的最高位都是1,那么就溢出了.但是这样很麻烦,也没必要.直接十进制算看看超出范围没有就行 追问:那-4-3 进行补码运算,有溢出吗?回答:没有溢出 追问:根据感觉判断是没有溢出,可是换成补码,运算后有进位,像是溢出了,所以不理解 回答:溢出不是看进位.是进位和两个数字的符号位综合起来看的.
补码,是代表正负数,参加运算的。
如果,运算结果,超出了补码的表示范围,这就是溢出了。
比如八位的补码,其表示范围是:-128~+127。
(-75)+(-64),是否溢出?
你算一下,应该得-139。 这显然就溢出了。
用二进制补码的算法来判断,也可以,但是就是麻烦一些。
正+正得负、负+负得正,这也就溢出了。
学过全忘了
使用双符号位进行计算就可以了,正的前面符号位是"00",负的前面的符号位是"11",假如进行补码运算的结果符号位是"00"或者"11",则表示没有溢出;假如结果符号位是"10"或者"01",则表示有溢出.

补码运算为什么会溢出

无论采用什么码!
只要运算的结果,大于设备所能表示数的范围,就会产生溢出。
八位二进制,表示无符号数的范围是:0 ~ 255。
八位二进制,表示带符号数的范围是:-128 ~ +127。
无符号数的运算结果,超出范围,就溢出了。特征是“进位=1”。
带符号数的运算结果,超出范围,也溢出了。特征是“结果的符号异常”。

补码运算为什么会溢出

运算的结果大于数值设备所能表示数的范围,就会产生溢出。
如何判断补码溢出:
可以通过最高位与次高位进位来判断:若最高数值位向符号位的进位值与符号位产生的进位输出值不相同,则表明加减运算产生了溢出。
溢出现象应当作一种故障来处理,因为它使结果数发生错误。异号两数相加时,实际是两数的绝对值相减,不可能产生溢出,但有可能出现正常进位;同号两数相加时,实际上是两数的绝对值相加,既可能产生溢出,也可能出现正常进位。 由于补码运算存在符号位进位自然丢失而运算结果正确的问题,因此,应区分补码的溢出与正常进位。
补码溢出详解:
128 =1000 0000,8位机器
[-128]原码 = 1000 0000发生了溢出,最高位表示符号位:0为正数,1为负数
[-128]反码 = 1111 1111除符号位外,各位取反
[-128]补码 = 1000 0000 反码的末位加1,不能影响符号位
运算的结果大于数值设备所能表示数的范围,就会产生溢出。
正数+正数,得到的和,太大了,就会溢出。
此外还有:负数+负数、正数-负数、负数-正数,
这四种算法,都有可能溢出。
而:正数-负数,等四种,是绝对不会溢出的。
知道了这些,就不用“滥判断”是否溢出了。
------
八位的补码是:0000 0000~1111 1111。
写成十进制就是:0~255。
其中的 0~127,是正数的补码。
而 128~255,则是-128~-1 的补码。
所能表示的范围是:-128~+127。
-----
按照补码运算:99 + 87 = 186。
超出了所能表示的范围,当然是溢出了。
即:正99+正87,却得到了-70 的补码。
99D=2^6+2^5+2^1+2^0=0110 0011B
87D=2^6+2^4+2^2+2^1+2^0=0101 0111B
0110 0011B
0101 0111B
1011 1010B
即99D+87D=1011 1010B
1011 1010B
取反为
0100 0101B
加1为
0100 0110B
即(99D+87D)的补码=0100 0110B 无溢出
因为99D+87D=186D
对于无符号8位二进制数来说186D在0 - (2^8)-1即0 - 255这个区间当中 故无溢出
另外
计算补码有个更加方便的公式
对于99D+87D=186D这个数在0 - 255 这个区间当中 那么
186D可以看作无符号8位二进制数
那么
186D的补码=256D-186D=70D
即(99D+87D)的补码=70D=0100 0110B=106O=46H
什么是溢出?
溢出,是指数据的大小,超出了编码所能表示的范围。
不仅是补码计算,任何形式的计算,都可能产生溢出。
比如:1999 年、2000 年 ...,这是用 4 位十进制表示。
当到了 9999 年,再过一年,你如果还用 4 位表示,就会溢出了。
如果不限制编码的位数,那就不存在溢出的问题。
-----------------------------
两种常用的数字,在计算机中,都是用机器码代表的。其范围如下:
机器码,无论代表什么数字,只要运算结果超出范围,就是【溢出】。
但是,在计算机专业人的嘴里,就不一样了。
  【无符号数的溢出】,不叫溢出,要叫做【进位】。
  【带符号数的溢出】,才叫做【溢出】。
搞计算机的这些人,基本概念不清,却自命不凡!
冒充脑回路清奇。。。正常人对此,就只能无语了。
---------------------------
就按照计算机专业的说法吧:
  溢出,是指“补码运算结果超出范围”。
  溢出的特征,是“符号错误”。
知道了这些,判断是否溢出,就很容易了。
一、无符号数的运算,肯定不会溢出。只有进位。
二、只有:正+正、负+负,才有可能超出范围。不是这些,就绝不会溢出。
三、人工用数值计算。和,如果没有超出范围,就没有溢出。
四、人工用补码计算。和的符号,如果正确,就没有溢出。
五、编个程序,让计算机计算。然后观察溢出标志位,为零,就没有溢出。
六、人工用补码计算,如“最高位的进位”和“次高位的进位”相同,就没有溢出。
第六种,本是 CPU 的硬件所用的方法。
硬件,其理论基础,是很晦涩难懂的。
异或运算,一般也不需要初学者掌握。
但是,一些爱得瑟的老师,偏爱介绍这种方法。
却又拿不出任何的理论!
其实,这是很无聊的表现,其实,他们就是想要难为学生。

补码溢出的意思意思

运算结果超载规定字长的补码所表示的数值范围,即溢出。
例如:已知X=+1001011,Y=+1101011,运用补码运算规则计算X+Y:
[X]补 = 0100 1011
[Y]补 = 0110 1011 (+
-------------------
[X+Y]补 = 1011 0110
Cs⊕Cp = 0⊕1 = 1 ,正溢出
(Cs是符号位的进位,Cp是最高数值位的进位,⊕表示异或)
X+Y = +1011 0110B = +182D
补码表示的8位二进制有符号整数范围: -128D ~ +127D, +182D超出此范围,溢出。
当两个以补码表示的负数相加时,会遇到两个问题。第一是两个负数的符号位相加,1+1后,本位为零,似乎负数相加变成了正数;其二是两个负数的数值部分之和,如果不向符号位进位。
只有真正意义上的相加才可能溢出,比如:正+正,负+负,正-负,负-正
什么是溢出?
溢出,是指数据的大小,超出了编码所能表示的范围。
不仅是补码计算,任何形式的计算,都可能产生溢出。
比如:1999 年、2000 年 ...,这是用 4 位十进制表示。
当到了 9999 年,再过一年,你如果还用 4 位表示,就会溢出了。
 
如果不限制编码的位数,那就不存在溢出的问题。
-----------------------------
无符号数的溢出
计算机所能运算的位数是固定的,如:八位机、16、32、64 位机。
当字长为八位时,其计数范围是:0000 0000~1111 1111。
用它们表示十进制的【自然数】,就是:0~255。
在小学学过的【自然数】,在计算机专业中,改称为“无符号数”。
---------------
如果在其最大值(255)再加上一,就会超出表示范围,发生溢出。
此时,八个位就都为 0,进位将为 1。
进位为 1,就是无符号数溢出的标志。
 
进位 1,代表十进制的 256。
256 也就是八位二进制的计数周期,计算机专业改称为“模”。
-----------------------------
带符号数的溢出
八位二进制也能表示【整数】,包括了【正整数、零和负整数】。
在小学学过的【整数】,在计算机专业中,改称为“带符号数”。
 
此时,0 ~ 127,就直接代表【零和正整数】;
   128~255,是以补码代表【负整数 (-128~-1)】。
---------------
在正数最大值(+127)上再加+1,就会超出表示范围,发生溢出。
此时得到的是 128,这是负数(-128)的补码。
注意,此时的进位为 0,结果的符号错误,才是溢出的特征。
---------------
在负数最小值(-128)再加-1,也会超出范围,发生溢出。
 
计算如下:
     1000 0000
   + 1111 1111
  ---------
   (1) 0111 1111
 
此时,得到的是正数(+127)!
 
注意,此时的进位为 1,并无意义。
   结果的符号错误,才是溢出的特征。
---------------
“带符号数”溢出的特征是:运算结果的符号,与正常结果相反。
“带符号数”的溢出,与进位是 1 是 0,并无关系。
---------------
判断是否溢出的方法
因为“带符号数”运算发生溢出,必定是结果超出范围。
所以,只有如下四种运算,才有可能出现溢出:
 正数+正数、负数+负数、正数-负数、负数-正数。
其它运算如:正-正、...,就不必考虑溢出了。
 
由人工计算:就可根据数据的符号来判断,如:
  正+正,出现负的结果;
  负+负,出现正的结果;
  ... ...
 
  发生上述四种之一,就是溢出。
 
也可考查进位与次高位的进位,两者不同,就是溢出。
 
用 CPU 计算:它能自动判断,如果发生溢出则会置位 OF。
-----------------------------

阅读更多 >>>  5的补码怎么算,+5,-5用8二进制补码表示为多少?详细解答

怎样根据运算数和结果的符号状态判断补码运算溢出

一、你可以观察标志寄存器中的 OF 标志位。
  当其为一时,即说明产生了溢出。
二、你可以问一问网上高手。
  当他说出现溢出,就是发生了溢出。
三、你自己算。
  方法,书上都有。
溢出判断,一般用双符号位进行判断:符号位00
表示正数
11
表示负数
结果的符号位为01时,称为上溢;为10时,称为下溢设x和y是4位的有符号数,x=7,y=-7,符号位为双符号位
用补码求x+y,x-y
[x]补+[y]补=00
111+11
001=0
0000结果不溢出
[x-y]补=[x]补+[-y]补=00
111+00
111=0
1110结果上溢出。同理,可以判断x,y为其他位数的补码运算溢出。

网站数据信息

"补码运算溢出的条件是参加运算的两个操作数的符号位,计算机补码运算的溢出叛别方法?"浏览人数已经达到23次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:补码运算溢出的条件是参加运算的两个操作数的符号位,计算机补码运算的溢出叛别方法?的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!