加法器如何计算无符号数减法

JohnTitor 2011-11-08 11:15:10
这个问题困扰了我好久。对于有符号数来说,A-B=A+(-B)即是A+B的补码(A和B都为正数),这个好理解。
举个例子,在4位二进制系统里面,对于有符号数,7-3=0111-0011=0111+1101=(1)0100括号里面的为进位,根据有符号数加法的规则,我们知道7-3没有溢出,所以结果0100是对的。
但是对于无符号数来说,如果没有减法器,只有加法器,那么在计算7-3时候会有什么情况呢,如果我们还是用上面的方式来计算,即7-3=0111-0011=0111+1101=(1)0100,那么根据无符号数加法的规则,有进位就代表溢出,那么也就是说结果0100溢出了,但事实上这个结果是没有溢出的。这么说来,加法器岂不是不能用来计算无符号数减法???
但是为什么很多书都说减法可以由加法器来实现呢?
...全文
2487 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjc12345678hjc 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 64 楼 cgl_lgs 的回复:]
呵呵,是这样的,我感觉楼上两位好像没说到一处去:)
对于ALU,它确实不去管有无符号。它只是机械地按自己的规则计算并置位。
再上一层:
ADD和SUB指令也不管是否有无符号,因为在补码系统里,有无符号的算法是一致的:)

而溢出与否,只跟FLAG相关。在X86中,有两个溢出标志:CF和OF。

上面的这些相信两位都没异义吧。有异义的是这:

怎样认为现在的操作是否溢出呢?

……
[/Quote]

完全同意你的看法
因为你不去考虑两个数大小问题,就不存在什么溢出与不溢出的事。虽然溢出标志位置1了,但这只说明运算产生这种结果,只有你去考虑两个数大小问题是才根据溢出标志位来说有没有溢出的事!
JohnTitor 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 hjc12345678hjc 的回复:]

你怎么理解都没关系,系统按照它的规则判断,因为它都是按补码运算!
按它的规则仍然没有溢出!
[/Quote]

感觉你对溢出规则还不是十分理解,CPU有个OF的标志位,但是这个只是针对有符号数的。有符号数和无符号数算术运算的溢出规则根本不一样,不可混为一谈。你可以把你所看到的溢出规则,其出处(哪一本书),贴出来。让大家都来鉴定一下
hjc12345678hjc 2011-11-11
  • 打赏
  • 举报
回复
我就说你那个运算没有溢出,你还是没搞懂溢出与没溢出!
0111
1101 +
10100 (进位为1)
这个运算按规则就是没有溢出!!!
只是有进位!
hjc12345678hjc 2011-11-11
  • 打赏
  • 举报
回复
因为没有有无符号的区别,你认为的-3和+13对它没有意义,它就认为是1101
hjc12345678hjc 2011-11-11
  • 打赏
  • 举报
回复
你怎么理解都没关系,系统按照它的规则判断,因为它都是按补码运算!
按它的规则仍然没有溢出!
JohnTitor 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 hjc12345678hjc 的回复:]

既然不区分有符号位和无符号位,那么还要区分有符号的溢出规则和无符号的溢出规则吗?

你的
7-3=7+(-3)=
0111
1101 +
10100 (进位为1)
想说明什么问题?
你想说这是溢出了?
你再看看规则,这并没有溢出!!!
有进位不代表溢出!!!
溢出标志位只是针对你认为有符号运算时的一种提示而已!对运算的数系统就根本不区分是什么数的!!!
[/Quote]

那我们就先把7-3放一边,就针对那个二进制竖式而言:
0111
1101 +
10100 (进位为1)
对于这个竖式,你说它没有溢出?不对吧?我可以把他理解为7+13=4,溢出了吗?

hjc12345678hjc 2011-11-11
  • 打赏
  • 举报
回复
系统有减法指令并不代表系统就有减法器,系统对加减乘除的运算都是通过加法器和移位的办法来完成的!!
hjc12345678hjc 2011-11-11
  • 打赏
  • 举报
回复
既然不区分有符号位和无符号位,那么还要区分有符号的溢出规则和无符号的溢出规则吗?

你的
7-3=7+(-3)=
0111
1101 +
10100 (进位为1)
想说明什么问题?
你想说这是溢出了?
你再看看规则,这并没有溢出!!!
有进位不代表溢出!!!
溢出标志位只是针对你认为有符号运算时的一种提示而已!对运算的数系统就根本不区分是什么数的!!!
JohnTitor 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 hjc12345678hjc 的回复:]

计算机里面做的运算都是补码运算,有符号数还是无符号数,计算机是不管的,其实这个只是写给编译器看的,由编译器去识别。并且生成相对应的代码。



你一直在说有符号数和无符号数,那是对你而言的,你怎么让系统明白你给的是有符号数还是无符号数的?
汇编语言里你用什么方式定义有符号数和无符号数的?
[/Quote]

你说的是对的,系统的确不区分有符号数和无符号数,并且系统做的运算都是补码运算,这些都是没有问题。现在再回到我们的问题,7-3,在没有SUB指令的情况下,你怎么去用ADD来计算7-3呢?虽然现在80x86的CPU都有SUB指令,但是有些单片机由于成本控制,是没有SUB指令的,只有ADD指令。如果现在让你对这种单片机来编程,你怎么计算7-3?
你只能这样做(都是补码运算)
7-3=7+(-3)=
0111
1101 +
10100 (进位为1)
你如何来解释这个结果?

因为如你所说,系统式不区分有符号和无符号的,所以这个结果得由人(或者编译器)来解释。好,如果我们把7和3都理解为有符号数的话,那我们知道结果没有溢出,因为有符号数运算的结果不以进位来解释。
如果我们把7和3都理解为无符号数呢?那无符号数的溢出规则是什么呢?

hjc12345678hjc 2011-11-11
  • 打赏
  • 举报
回复
计算机里面做的运算都是补码运算,有符号数还是无符号数,计算机是不管的,其实这个只是写给编译器看的,由编译器去识别。并且生成相对应的代码。



你一直在说有符号数和无符号数,那是对你而言的,你怎么让系统明白你给的是有符号数还是无符号数的?
汇编语言里你用什么方式定义有符号数和无符号数的?
cgl_lgs 2011-11-11
  • 打赏
  • 举报
回复
呵呵,是这样的,我感觉楼上两位好像没说到一处去:)
对于ALU,它确实不去管有无符号。它只是机械地按自己的规则计算并置位。
再上一层:
ADD和SUB指令也不管是否有无符号,因为在补码系统里,有无符号的算法是一致的:)

而溢出与否,只跟FLAG相关。在X86中,有两个溢出标志:CF和OF。

上面的这些相信两位都没异义吧。有异义的是这:

怎样认为现在的操作是否溢出呢?

其实这个也很简单,只要你认为是在对两个数在做大小比较,然后根据结果做跳转,那就完全OK了:)A-B是否溢出其实就是在比较A和B然后看置位嘛:)
JohnTitor 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 61 楼 hjc12345678hjc 的回复:]

引用 59 楼 johntitor 的回复:
引用 58 楼 hjc12345678hjc 的回复:

既然是人的事,那就看你想把它看成有符号数还是无符号数了


接着你的话,那假设把它看成无符号数呢?有没有溢出?判断的依据是什么?

注意你的前提,这是人在考虑问题
我说没有溢出,只是系统将溢出标志位置1了,溢出标志位置1跟溢出不等同
因为所谓溢出是对人说的!!
[/Quote]

人说的也要有依据的,是吧?不能说你说溢出它就溢出,总要有根有据的,我就想知道你的依据(也就是人的依据)
JohnTitor 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 60 楼 hjc12345678hjc 的回复:]

你再返回去看看你第一楼说的每一句话
[/Quote]

但是你还没有回答我的问题,1楼里面的是另外一个问题。
我就想知道如果人把它看成无符号数的话,判断溢出的依据是什么?
hjc12345678hjc 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 59 楼 johntitor 的回复:]
引用 58 楼 hjc12345678hjc 的回复:

既然是人的事,那就看你想把它看成有符号数还是无符号数了


接着你的话,那假设把它看成无符号数呢?有没有溢出?判断的依据是什么?
[/Quote]
注意你的前提,这是人在考虑问题
我说没有溢出,只是系统将溢出标志位置1了,溢出标志位置1跟溢出不等同
因为所谓溢出是对人说的!!
hjc12345678hjc 2011-11-11
  • 打赏
  • 举报
回复
你再返回去看看你第一楼说的每一句话
JohnTitor 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 hjc12345678hjc 的回复:]

既然是人的事,那就看你想把它看成有符号数还是无符号数了
[/Quote]

接着你的话,那假设把它看成无符号数呢?有没有溢出?判断的依据是什么?
hjc12345678hjc 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 johntitor 的回复:]
引用 56 楼 hjc12345678hjc 的回复:

我的答案很清楚,不管是有符号数还是无符号数,系统不管溢出不溢出,只是将次高位和最高位的进位值异或后放在溢出标志位,溢出不溢出是人的事,不是机器的事!


确实是人的事,那么现在就是要求你站在人的角度来看,01111111 + 00000001,到底有没有溢出?我们不去管机器,作为人来说,你怎么判断这个加法有没有溢出?请给出明确的结……
[/Quote]

既然是人的事,那就看你想把它看成有符号数还是无符号数了
JohnTitor 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 hjc12345678hjc 的回复:]

我的答案很清楚,不管是有符号数还是无符号数,系统不管溢出不溢出,只是将次高位和最高位的进位值异或后放在溢出标志位,溢出不溢出是人的事,不是机器的事!
[/Quote]

确实是人的事,那么现在就是要求你站在人的角度来看,01111111 + 00000001,到底有没有溢出?我们不去管机器,作为人来说,你怎么判断这个加法有没有溢出?请给出明确的结果
hjc12345678hjc 2011-11-11
  • 打赏
  • 举报
回复
我的答案很清楚,不管是有符号数还是无符号数,系统不管溢出不溢出,只是将次高位和最高位的进位值异或后放在溢出标志位,溢出不溢出是人的事,不是机器的事!
JohnTitor 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 hjc12345678hjc 的回复:]

你又说了,是你认为它是有符号或无符号了,系统只是异或规则将溢出标志位置1,异或标志位置1,有没有溢出系统不管,只是你认为溢出标志位为1是溢出了,系统没说,我也没说!
[/Quote]

下班了,最后问你一个问题,两个无符号数相加,你怎么判断结果有没有溢出?希望你能给出准确并且有依据的答案
加载更多回复(45)

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧