免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: jeanlove
打印 上一主题 下一主题

反码和补码在哪里? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-07-19 15:08 |只看该作者
好帖要学习

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
22 [报告]
发表于 2009-07-19 15:37 |只看该作者
原帖由 beepbug 于 2009-7-19 14:00 发表
补码机不做减法运算。
不是可以不可以的问题,是不需要。这是补码的长处之一。

......我记得兄台是设计数字芯片的,不应该这么来解释这个问题吧。
无论是用什么码,
加法与减法如果共用一个加法器一般过程有点像如下:
a ------------
                   > a+(-b) (加法)
b ->  -b ----
再准确点,应该如下:
a ------------
                   > a+f(b)(可能要再设置符号等相关东西) (加法)
b ->  f(b) ----

这怎么成了补码的长处..........

[ 本帖最后由 cjaizss 于 2009-7-19 15:43 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
23 [报告]
发表于 2009-07-19 15:40 |只看该作者
原帖由 cjaizss 于 2009-7-19 15:37 发表

......我记得兄台是设计数字芯片的,不应该这么来解释这个问题吧。
无论是用什么码,
加法与减法如果共用一个加法器一般过程大致如下:
a ------------
                   > a+(-b) (加法)
b ->  -b  ...

补码稍有不同:
a ------------
                   > a+(~b)+1 (加法)
b ->  ~b ----

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
24 [报告]
发表于 2009-07-19 16:26 |只看该作者
用verilog描述一下,大致如下:
假如有个加法器模块为add(out,clk,en,a,b,c);
先不管各种标志。

  1. module
  2. add(out,clk,a,b,c);
  3. output[31:0]out;
  4. input clk;
  5. input en;
  6. input[31:0]a;
  7. input[31:0]b;
  8. input c;
  9. endmodule
复制代码

加法减法统一在一起大致可能如下(示意):

  1. module ADD_SUB(out,clk,en,add_or_sub,a,b,c);
  2. output[31:0]out;
  3. input clk;
  4. input add_or_sub;
  5. input[31:0]a;
  6. input[31:0]b;
  7. input c;
  8. wire[31:0]B;
  9. assign B=add_or_sub?b:~b;
  10. assign C=add_or_sub?~c:c;
  11. add add_inst(.out(out),.clk(clk),.en(en),.a(a),.b(B),.c(C));
  12. endmodule
复制代码

论坛徽章:
0
25 [报告]
发表于 2009-07-19 21:07 |只看该作者
1)我不是搞数字芯片设计的。我是乱七八糟什么都摸过一点皮毛,也什么都只摸过一点皮毛。
2)呵呵,你的23帖里,其实已经说明了补码的特点。详细我也忘了,老书丢老房子了。等找到了,再和您扯吧。
3)补码判溢:如果是8位机,运算器是9位,两符号位与数据位一起运算。如果高符号位还有进位,丢弃(借位也被忽略)。只需一异或逻辑接在两符号位上,即得溢出信号,并由此刷新状态寄存器的溢出位。计算一结束,判溢也完成了。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
26 [报告]
发表于 2009-07-19 21:21 |只看该作者
"运算器是9位",很多书都会这么写,但我一向觉得这种说法很有问题,因为会给人造成误解,我宁可说是8位+8位得到一个8位的结果再加上一些标志位。
“你的23帖里,其实已经说明了补码的特点”
其实怎么说呢,恩,这样说吧,我的22楼已经列举了
a ------------
                   > a+f(b)(可能要再设置符号等相关东西) (加法)
b ->  f(b) ----
这种手段,23楼只是给了一个补码的实现而已。
如果你懂得数字设计,应该也很容易用类似的手段实现反码以及原码的

论坛徽章:
0
27 [报告]
发表于 2009-07-19 21:52 |只看该作者
这个是确实的。不光是原理,PDP-11机内部就这结构。补码机,运算器的字长=机器字长+1。就是利用双符号位做溢出判断的。
状态寄存器里的标志位,是不会自行生成的。判溢电路的输出,去刷新溢出位。
你自己做几个8位加法计算吧,就是用9位做。试几种情况,看如何判溢。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
28 [报告]
发表于 2009-07-19 22:06 |只看该作者
原帖由 beepbug 于 2009-7-19 21:52 发表
这个是确实的。不光是原理,PDP-11机内部就这结构。补码机,运算器的字长=机器字长+1。就是利用双符号位做溢出判断的。
状态寄存器里的标志位,是不会自行生成的。判溢电路的输出,去刷新溢出位。
你自己做几 ...

这个要看你如何认为了,比如,我永远不会认为半加器(你应该明白什么是半加器吧)是2bit的,那么我自然也不会认为什么33位加法器。关键在于你自己是怎么认为的,前提是要明白数字设计的一些原理,怎么认为都可以,只要不发生误解。在不明白数字设计的前提下,33位还是32位那只是一个数字,没任何实际帮助。

[ 本帖最后由 cjaizss 于 2009-7-19 22:17 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
29 [报告]
发表于 2009-07-19 22:21 |只看该作者
再给你举个例子吧。
比如说有9bit x 9bit = 18bit这样的乘法器
我们称呼为9x9乘法器,或者干脆称呼为9位乘法器,但不会有人称呼为18位乘法器。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
30 [报告]
发表于 2009-07-19 22:56 |只看该作者
不过,如果你还想争,我还是建议兄台先学学数字设计的相关东西,这样比较有说服力一点。
恕我直言,兄台可能对数字设计了解的并不多,因为一个对于数字设计了解的比较多的人不会因为这个是8位还是9位的问题跟我争论。

[ 本帖最后由 cjaizss 于 2009-7-19 23:22 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP