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

如题所述

补码加法运算溢出判断三种方法:

    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个回答  2023-03-06

溢出,是指数据的大小,超出了编码所能表示的范围。

不仅是补码计算,任何形式的计算,都可能产生溢出。

比如: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。

  带符号数溢出,结果的符号有错。

--------------------

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

这很简单。

一、如果不是“正+正、负+负、正-负、负-正”,肯定就不会溢出。

二、用十进制数,进行人工计算,结果超出范围,就是溢出。

三、用二进制数,进行人工计算,结果符号有错,就是溢出。

另外还有一种“两个进位异或”的判断方法。

这种方法,是计算机内部硬件所用的。

硬件的理论,是很难懂的。

异或,怎么就能导出溢出,理论何在?

书上也没有介绍。 显然,老师都不知道是怎么回事!

但是,有些老师,就是爱得瑟,专爱讲这种没头没脑的方法,以示高深。

相似回答