什么是补码加减运算溢出?判别溢出有哪几种方法?并我说明工作原理。
对于加法来说,操作数符号可能是:
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,所以最高有效位必然没有发生进位。
参考资料
整数:[A]补+[B]补=[A+B]补 (模为2的n+1次方,因为可能会有进位)
小数:[A]补+[B]补=[A+B]补 (模为2,因为A和B都小于1)
(2)补码减法运算:
因为A-B = A+(-B),所以减法可以变通为加法进行计算。
整数:[A-B]补=[A]补+[-B]补 (模为2的n+1次方)
小数:[A-B]补=[A]补+[-B]补 (模为2)
在做补码加减法时,只需将符号位和数值部分一起参加运算,并且将符号位的进位自然丢掉就可以了。但是,当运算结果超出机器字长所能表示的数值范围,这种情况叫做溢出。
(3)判断溢出:
溢出出现的情况:正数+正数,负数+负数,正数-负数,负数-正数 这四种情况,当参加运算的两个数的符号(正负)相同,而结果则与这2个数的符号不同,即为溢出。
计算机中通常将两个参与运算的数的符号位产生的进位与最高有效位(",""."后的那位)产生的进位进行异或操作(无进位即进位为0),异或结果为1,是溢出,异或结果为0,无溢出。
最后个并说明工作原理呢?怎么没有?
从规律上看凡是发生溢出操作,“最高有效位进位”和“符号位进位”必然是一个是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,所以最高有效位必然没有发生进位。
什么是溢出?
溢出,是指数据的大小,超出了编码所能表示的范围。
不仅是补码计算,任何形式的计算,都可能产生溢出。
比如:1999 年、2000 年 ...,这是用 4 位十进制表示。
当到了 9999 年,再过一年,你如果还用 4 位表示,就会溢出了。
如果不限制编码的位数,那就不存在溢出的问题。
-----------------------------
两种常用的数字,在计算机中,都是用机器码代表的。其范围如下:
机器码,无论代表什么数字,只要运算结果超出范围,就是【溢出】。
但是,在计算机专业人的嘴里,就不一样了。
【无符号数的溢出】,不叫溢出,要叫做【进位】。
【带符号数的溢出】,才叫做【溢出】。
搞计算机的这些人,基本概念不清,却自命不凡!
冒充脑回路清奇。。。正常人对此,就只能无语了。
---------------------------
就按照计算机专业的说法吧:
溢出,是指“补码运算结果超出范围”。
溢出的特征,是“符号错误”。
知道了这些,判断是否溢出,就很容易了。
一、无符号数的运算,肯定不会溢出。只有进位。
二、只有:正+正、负+负,才有可能超出范围。不是这些,就绝不会溢出。
三、人工用数值计算。和,如果没有超出范围,就没有溢出。
四、人工用补码计算。和的符号,如果正确,就没有溢出。
五、编个程序,让计算机计算。然后观察溢出标志位,为零,就没有溢出。
六、人工用补码计算,如“最高位的进位”和“次高位的进位”相同,就没有溢出。
第六种,本是 CPU 的硬件所用的方法。
硬件,其理论基础,是很晦涩难懂的。
异或运算,一般也不需要初学者掌握。
但是,一些爱得瑟的老师,偏爱介绍这种方法。
却又拿不出任何的理论!
其实,这是很无聊的表现,其实,他们就是想要难为学生。
不仅是补码运算,任何形式的计算,都可能产生溢出。
比如:1999 年、2000 年 ...,这是用四位十进制表示。
当到了 9999 年,再过一年,你如果还用四位表示,这就溢出了。
字长为 8 位二进制,补码的范围是-128 至+127。
那么,+125 + 4 = +129,这就溢出了。
判断溢出的方法:
一、自己人工运算一下,如结果(符号)不正确,即为溢出。
二、编程,令 CPU 计算,如 OF=1,即为溢出。
三、上网求助高人帮你判断。