什么是补码加减运算溢出?判别溢出有哪几种方法?并我说明工作原理。
(1)
两个符号相同的补码数相加,如果和的符号与加数的符号相反,或两个符号相反的补码数相减,差的符号与减数的符号相同,都属于运算结果溢出。这种判别方法比较复杂,要区别加还是减两种不同运算情况,还要检查结果的符号与其中一个操作数的符号的同异,故很少使用;
(2)
两个补码数相加减时,若最高数值位向符号位送的进位值与符号位送向更高位的进位值不相同,也是运算结果溢出。
(3)
在采用双符号位(如定点小数的模4补码)运算时,若两个符号位的得值不同(01或10)则是溢出。01表明两个正数相加,结果大于机器所能表示的最大正数,称为"上溢";10表明两个负数相加,结果小于机器所能表示的最小负数,称为"下溢";双符号位的高位符号位,不管结果溢出否,均是运算结果正确的符号位,这个结论在乘法运算过程中是很有实际意义的。请注意,在采用双符号位的方案中,在寄存器和内存储器存储数据时,只需存一位符号,双符号位仅用在加法器线路部分。
再次强调,这三种不同说法是对同一个事实的略有区别的表述,实现时用到的线路可以有所区别,但问题的实质是完全一样的。
不仅是补码运算,任何形式的计算,都可能产生溢出。
比如:1999 年、2000 年 ...,这是用四位十进制表示。
当到了 9999 年,再过一年,你如果还用四位表示,这就溢出了。
字长为 8 位二进制,补码的范围是-128 至+127。
那么,+125 + 4 = +129,这就溢出了。
判断溢出的方法:
一、自己人工运算一下,如结果(符号)不正确,即为溢出。
二、编程,令 CPU 计算,如 OF=1,即为溢出。
三、上网求助高人来判断。
溢出,可以说:数据的大小,超出了编码所能表示的范围。
不仅是补码计算,任何形式的计算,都可能产生溢出。
比如:1999 年、2000 年 ...,这是用 4 位十进制表示年份。
当过了 9999 年,你如果还用 4 位表示,就会溢出了。
为了避免溢出,就应该增加编码的位数。
某城市的电话号码,升至八位,就是这个道理。
-----------------------
在计算机中,以一个字节为一个存储单元。
其中的二进制,写成十进制,就是:0~255。
当两个字节相加的和,超出了 255,就会出现进位。
这就是“无符号数”的溢出。
-------------
另外,同样这一个字节,也可以当做补码,代表正负数。
其中的 0~127,代表零和正数。
另外的 128~255,则代表-128~-1。
那么,当: (+30) + (+120) = +150 时,
结果超出了 +127,那么,它就是代表负数了。
同样道理,负数+负数,也有可能得出“正数”。
符号异常,就是“带符号数”的溢出,也称为“补码运算的溢出”。
-------------
针对这两种溢出,Intel 在 CPU 中,设计了两个标志位:CF、OF。
无符号数运算时,一旦出现溢出,CPU 则令 CF=1。
带符号数运算时,一旦出现溢出,CPU 则令 OF=1。
这两个标志位,译成中文,是:进位标志位、溢出标志位。
由于 Intel 的如此设计,那么:
“溢出”这个词,就只能用来说明“带符号数”的运算了。
而“无符号数运算”时,即使出现了溢出,也只能叫做“进位”。
-----------------------
当然,离开计算机专业,就不必弄的这么混乱了。
溢出,究竟是什么意思? 其实大家都理解。