二进制补码计算 您所在的位置:网站首页 负数取反加一 二进制补码计算

二进制补码计算

2024-07-09 22:57| 来源: 网络整理| 查看: 265

位数问题

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:无符号数 * 无符号数

在这里插入图片描述 另一个例子: 8*9

case 1:无符号数 * 有符号数

在这里插入图片描述 第四个加数——a先补最高位(0 0001),再连同最高位取反(1 1110)加一(1 1111),最后乘以b的符号位 结果的最高位是符号位

case 2:有符号数 * 无符号数

在这里插入图片描述 每个加数——都要补符号位 结果的最高位是符号位

case 3:有符号数 * 有符号数

在这里插入图片描述 前三个加数——都要补符号位 第四个加数——a先补符号位(1 1001),再连同符号位取反(0 0110)加一(0 0111),最后乘以b的符号位。 结果的最高位是符号位

参考资料

https://www.allaboutcircuits.com/technical-articles/multiplication-examples-using-the-fixed-point-representation/

这个博主写的非!常!清!晰!建议有需要的朋友细品!!!


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有