lbaby 发表于 2009-07-19 15:08

好帖要学习

cjaizss 发表于 2009-07-19 15:37

原帖由 beepbug 于 2009-7-19 14:00 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
补码机不做减法运算。
不是可以不可以的问题,是不需要。这是补码的长处之一。
......我记得兄台是设计数字芯片的,不应该这么来解释这个问题吧。
无论是用什么码,
加法与减法如果共用一个加法器一般过程有点像如下:
a ------------
                   > a+(-b) (加法)
b ->-b ----
再准确点,应该如下:
a ------------
                   > a+f(b)(可能要再设置符号等相关东西) (加法)
b ->f(b) ----

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

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

cjaizss 发表于 2009-07-19 15:40

原帖由 cjaizss 于 2009-7-19 15:37 发表 http://linux.chinaunix.net/bbs/images/common/back.gif

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

cjaizss 发表于 2009-07-19 16:26

用verilog描述一下,大致如下:
假如有个加法器模块为add(out,clk,en,a,b,c);
先不管各种标志。

module
add(out,clk,a,b,c);
outputout;
input clk;
input en;
inputa;
inputb;
input c;
endmodule

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

module ADD_SUB(out,clk,en,add_or_sub,a,b,c);
outputout;
input clk;
input add_or_sub;
inputa;
inputb;
input c;
wireB;
assign B=add_or_sub?b:~b;
assign C=add_or_sub?~c:c;
add add_inst(.out(out),.clk(clk),.en(en),.a(a),.b(B),.c(C));
endmodule

beepbug 发表于 2009-07-19 21:07

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

cjaizss 发表于 2009-07-19 21:21

"运算器是9位",很多书都会这么写,但我一向觉得这种说法很有问题,因为会给人造成误解,我宁可说是8位+8位得到一个8位的结果再加上一些标志位。
“你的23帖里,其实已经说明了补码的特点”
其实怎么说呢,恩,这样说吧,我的22楼已经列举了
a ------------
                   > a+f(b)(可能要再设置符号等相关东西) (加法)
b ->f(b) ----
这种手段,23楼只是给了一个补码的实现而已。
如果你懂得数字设计,应该也很容易用类似的手段实现反码以及原码的

beepbug 发表于 2009-07-19 21:52

这个是确实的。不光是原理,PDP-11机内部就这结构。补码机,运算器的字长=机器字长+1。就是利用双符号位做溢出判断的。
状态寄存器里的标志位,是不会自行生成的。判溢电路的输出,去刷新溢出位。
你自己做几个8位加法计算吧,就是用9位做。试几种情况,看如何判溢。

cjaizss 发表于 2009-07-19 22:06

原帖由 beepbug 于 2009-7-19 21:52 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
这个是确实的。不光是原理,PDP-11机内部就这结构。补码机,运算器的字长=机器字长+1。就是利用双符号位做溢出判断的。
状态寄存器里的标志位,是不会自行生成的。判溢电路的输出,去刷新溢出位。
你自己做几 ...
这个要看你如何认为了,比如,我永远不会认为半加器(你应该明白什么是半加器吧)是2bit的,那么我自然也不会认为什么33位加法器。关键在于你自己是怎么认为的,前提是要明白数字设计的一些原理,怎么认为都可以,只要不发生误解。在不明白数字设计的前提下,33位还是32位那只是一个数字,没任何实际帮助。

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

cjaizss 发表于 2009-07-19 22:21

再给你举个例子吧。
比如说有9bit x 9bit = 18bit这样的乘法器
我们称呼为9x9乘法器,或者干脆称呼为9位乘法器,但不会有人称呼为18位乘法器。

cjaizss 发表于 2009-07-19 22:56

不过,如果你还想争,我还是建议兄台先学学数字设计的相关东西,这样比较有说服力一点。
恕我直言,兄台可能对数字设计了解的并不多,因为一个对于数字设计了解的比较多的人不会因为这个是8位还是9位的问题跟我争论。

[ 本帖最后由 cjaizss 于 2009-7-19 23:22 编辑 ]
页: 1 2 [3] 4
查看完整版本: 反码和补码在哪里?