||||
符号位——真的就这么一直错下去吗?
姜咏江
以前,我一直奇怪为什么西方的机器表示有符号数搞出一个“符号位”,而符号位的0或1又是不能参加机器数值计算的!我还一直怀疑是不是因为误传。昨天写书,认真地探讨了一下Quartu II中Verilog HDL假定的数据位数,验证了下面一段有符号加减法器的设计程序,才确认他们的理论确实有问题。
/ Quartus II Verilog Template
// Signed adder/subtractor
module signed_adder_subtractor
(
input signed [WIDTH-1:0] dataa,
input signed [WIDTH-1:0] datab,
input add_sub, // if this is 0, add; else subtract
input clk,
output reg [WIDTH:0] result
);
parameter WIDTH = 16;
always @ (posedge clk)
begin
if (!add_sub)
result <= dataa + datab;
else
result <= dataa - datab;
end
endmodule
利用Quartus II仿真时发现,运算结果总会给你加上一个符号位,显然这个符号位不是二进制数的一部分。例如,h0007-h0016,仿真给出的结果是h1FFF1,多出一位!按照“求反加一”的求值方法,应该得到h1FFF1的值是 -hE000F = - 131057,谬之千里矣!实际的结果值应是-15,也就是必须先去掉符号位求值。在机器运算的时候,也是这样做的吗?
由此我可以断言:至我之前,西方的数学界尚未认真地研究过机器记数的一般方法。
机器运算中随意在数值前面添加0或1,会造成识别与实际计算之间的大麻烦,特别是电路设计,会造成相当数量的浪费。我应当为我的限位数理论自豪。看来机器精确计算还大有搞头。
电子电路设计的科学家们,难道我们还要这样一直错下去吗?
2013-6-13
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-6-1 22:17
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社