二进制计算?

csoma 2012-09-08 08:24:16
CPU只有一个加法器,没减法器,对否?
CPU计算减法时,当加法来运算。


十进制:(-3)-(-7);

-3:用补码
-7:用补码

用二进制的方法,怎样计算两个负数相减?
...全文
222 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alexander 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
CPU只有一个加法器,没减法器,对否?
CPU计算减法时,当加法来运算。


十进制:(-3)-(-7);

-3:用补码
-7:用补码

用二进制的方法,怎样计算两个负数相减?
[/Quote]
别人答过的在下不再作答:
CPU只有一个加法器,没减法器,对否?
错的。CPU中只有加法器,不存在减法器(话说根本不存在减法器这种数字电路……)。严格的说一个运算器里只有一个加法器。但对于多核CPU来说,每一个内核都有自己的运算器。所以CPU中的加法器个数是与内核数目相同的。
PS:如果LZ这题是题库里的话建议给肯定答案,因为题库里有不少题目是在多核CPU出现之前就加入了的。

CPU计算减法时,当加法来运算。
既然CPU中只有加法器,那用加法来代替减法运算就是理所当然的了吧。
Alexander 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

两个整数相加,可能是以下的情况:

1.两个正数,相加
3+7
2,一正一负,相加
-3+7
3.两个负数,相加
-3+(-7)


怎样知道计算结果,溢出?
[/Quote]
好像没人答这个:
1.两正数相加,结果符号位为负则溢出;
2.正负数相加,不会溢出;
3.两负数相加,结果符号位为正则溢出。
左眼看到鬼 2012-09-08
  • 打赏
  • 举报
回复
为什么要舍掉那个1呢?
csoma 2012-09-08
  • 打赏
  • 举报
回复
两个正数相加,肯定不会有溢出,对否?

如果,两个操作数,其中一个是负数。就有可能溢出,对否?
csoma 2012-09-08
  • 打赏
  • 举报
回复
两个整数相加,可能是以下的情况:

1.两个正数,相加
3+7
2,一正一负,相加
-3+7
3.两个负数,相加
-3+(-7)


怎样知道计算结果,溢出?
lulutong_ 2012-09-08
  • 打赏
  • 举报
回复
打错了从右向左数,蛋疼!我跳楼去了。[Quote=引用 8 楼 的回复:]
我又弄错了,是次高位,也就是从左向右数0,1,2,3,4,5,6,7中第6位数向第七位有无进位,而不是什么低四位向高四位有无进位。
我还是不多少了,怕误人子弟。
具体的去看《计算机组成原理》的《运算方法和运算器》章节吧。

引用 7 楼 的回复:
问题一:相加肯定不会溢出?
答:不对!当数值超过计算机所能表示的数值时就会造成溢出。如8位计算机所能表示的数值范围是1000 0000到
……
[/Quote]
lulutong_ 2012-09-08
  • 打赏
  • 举报
回复
弄错了,没有溢出!结果为正数,就是1 0000 0100溢出的1舍去,结果为4.[Quote=引用 1 楼 的回复:]
[x-y]补=[x]补-[y]补=[x]补+[-y]补
所以[(-3)-(-7)]补=[-3]补+[7]补
设计算机处理器为8位,则[-3]补=1111 1101,[7]补=0000 0111
所以[(-3)-(-7)]补=1 0000 0100。发生溢出,所以无法计算。
为什么会发生溢出?
-1的补码达到1111 1111,-3的补码1111 1101,当计算[-3]补+2的时候8位数……
[/Quote]
lulutong_ 2012-09-08
  • 打赏
  • 举报
回复
由补码减法:[x-y]补=[x]补-[y]补=[x]补+[-y]补
所以[(-3)-(-7)]补=[-3]补+[7]补
令计算机处理器为8位则
原式=1111 1101+0000 0111=1 0000 0100,产生溢出,所以无法计算。
(个人推到仅供参考,资料《计算机组成原理》,白中英,第32页)
lulutong_ 2012-09-08
  • 打赏
  • 举报
回复
[x-y]补=[x]补-[y]补=[x]补+[-y]补
所以[(-3)-(-7)]补=[-3]补+[7]补
设计算机处理器为8位,则[-3]补=1111 1101,[7]补=0000 0111
所以[(-3)-(-7)]补=1 0000 0100。发生溢出,所以无法计算。
为什么会发生溢出?
-1的补码达到1111 1111,-3的补码1111 1101,当计算[-3]补+2的时候8位数据已经占满,再加5必定溢出!
lulutong_ 2012-09-08
  • 打赏
  • 举报
回复
我又弄错了,是次高位,也就是从左向右数0,1,2,3,4,5,6,7中第6位数向第七位有无进位,而不是什么低四位向高四位有无进位。
我还是不多少了,怕误人子弟。
具体的去看《计算机组成原理》的《运算方法和运算器》章节吧。[Quote=引用 7 楼 的回复:]
问题一:相加肯定不会溢出?
答:不对!当数值超过计算机所能表示的数值时就会造成溢出。如8位计算机所能表示的数值范围是1000 0000到
0111 1111。其中1000 0000是-128的补码(2的8次方减1000 0000等于1000 0000即128),而不是-0,补码中0就是0000 0000.0111 1111因为高位为0所以为整数即127.
所以8位CPU最多可以表示-128~……
[/Quote]
lulutong_ 2012-09-08
  • 打赏
  • 举报
回复
问题一:相加肯定不会溢出?
答:不对!当数值超过计算机所能表示的数值时就会造成溢出。如8位计算机所能表示的数值范围是1000 0000到
0111 1111。其中1000 0000是-128的补码(2的8次方减1000 0000等于1000 0000即128),而不是-0,补码中0就是0000 0000.0111 1111因为高位为0所以为整数即127.
所以8位CPU最多可以表示-128~+127.
如果数值小于-128或大于+127则产生溢出,而不是相加肯定不会溢出。

问题二:
为什么那个1要去掉?
[-3]补+[7]补=1111 1101+0000 0111=1 0000 0100。
加法运算中低四位向高四位有进位,且高四位向高位(即不存在的第8位——从第0位算起)有进位,则多出的1
不算溢出。所以可以不管,因为8位CPU只能贮存8位数字,所以实际上多出的1保存不了,相当于不存在了。
但如果低四位向高四位有进位,而高四位向更高位无进位则发生溢出,如:
1001 0100
1000 0001
------------
10001 0101
右边的低四位数字向高四位没有进位,而第8位却多了个1,所以产生溢出。
这些判断是计算机数学家经过严密推理的,我反正只能套公式,如果你够牛,那你可以去挑战一下。
其他的你就要多看书了,一时半会说不清楚的。
[Quote=引用 5 楼 的回复:]
两个正数相加,肯定不会有溢出,对否?

如果,两个操作数,其中一个是负数。就有可能溢出,对否?
[/Quote]

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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