二进制补码计算——有符号数的乘法
位数问题a_width位的a,乘以B_width位的b,结果的位数是A_width + B_width。定点小数问题小数位数等于a的小数位数,加上b的小数位数之和。补码相乘问题补码 * 补码 = 补码无符号数 * 无符号数无符号数 * 有符号数第四个加数——a先补最高位(0 0001),再连同最高位取反(1 1110)加一(1 1111),最后乘以b的符号位结果的最高位是符号位有符号数 * 无符号
位数问题
a_width位的a,乘以B_width位的b,结果的位数是A_width + B_width。
定点小数问题
小数位数等于a的小数位数,加上b的小数位数之和。
补码相乘问题
-
补码 * 补码 = 补码
-
符号问题
1、无符号数 * 无符号数 = 无符号数
2、无符号数 * 有符号数 = 有符号数
3、有符号数 * 无符号数 = 有符号数
4、有符号数 * 有符号数 = 有符号数注意!上述符号关系仅适用于如下场景:
定义unsigned类型的变量,且人为规定该变量的最高位为符号位。wire unsigned [3:0] data_a; //data_a[3]表示符号位 wire unsigned [3:0] data_b; //data_b[3]表示符号位 assign data_a = 4'b1100; //data_a = -4(当做有符号的负数) assign data_b = 4'b0100; //data_b = 4(当做有符号的正数,或无符号数)
算法原理
为什么有的加数要两个符号位?有的加数的不用补符号位,而是选择经过取反+1后的乘法结果?
比如最后一个有符号位的乘法,为啥第四个加数与其他三个加数的行为不一致??
解答上述问题需要先看一下二进制补码的一个重要特性:
举个例子,-3 的二进制补码是100,所以我们在计算 100 所对应的十进制数值时:
这里-1表示符号位要用“负权重”,2^2的上标2表示该值要左移2位。
那么两个负数相乘时,我们以a×b = 1001×1100(即-7 × -4)为例说明:
1001*(-1)其实就是求1001取反加一,2^3就是乘完(-1)之后将乘积左移3位。同理,其余加数是:1001 * 1左位2位,1001 * 0左移1位,1001 * 0。
然后去看下边举例的case 3,很容易就可以和公式对应上了。
举例
case 0:无符号数 * 无符号数
另一个例子:
case 1:无符号数 * 有符号数
第四个加数——a先补最高位(0 0001),再连同最高位取反(1 1110)加一(1 1111),最后乘以b的符号位
结果的最高位是符号位
case 2:有符号数 * 无符号数
每个加数——都要补符号位
结果的最高位是符号位
case 3:有符号数 * 有符号数
前三个加数——都要补符号位
第四个加数——a先补符号位(1 1001),再连同符号位取反(0 0110)加一(0 0111),最后乘以b的符号位。
结果的最高位是符号位
参考资料
这个博主写的非!常!清!晰!建议有需要的朋友细品!!!
更多推荐
所有评论(0)