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