这要看数如何表示了。如果输入的数din,和累加器的数都用补码表示,可以这样处理:
1. 如果din的b6为0(非负)。若 acc_0+din, 的进位为1, 则{acc_2,acc_1}+1; 若进位为0,不管acc21。
2. 如果din的b6为1(负数)。若 acc_0+din, 的进位为0, 则{acc_2,acc_1} -1; 若进位为1,不管acc21。
第1点好理解。
第2点的解释如下: 若din是负数,则可表示为分段的21位数 7f_7f_din. 运算时acc0+din,acc21+7f_7f+进位. 若acc_0+din的进位为1,可先运算7f_7f+1 == 00_00(最高位丢弃), 则不管acc21。若进位为0, acc21最终要加7f_7f,也就是减1.
你可以编一个C语言程序来验证。 |