首页 > 其他分享 >有符号数乘法

有符号数乘法

时间:2023-07-24 16:25:28浏览次数:37  
标签:运算 符号 0f00f0 补码 textcolor red 乘法

最近在进行一些定点化设计仿真,对于二进制乘法,之前只是粗略的考虑了位数问题,没有细节思考乘法过程。刚刚思考了一下,给出解答。为了方便说明,会附带一些伪Verilog代码,希望读者不要挑毛病。
对于有符号数,通常有三种表示方法:原码、反码、补码。设计运算器时只用补码。
1. 补码

设一个N位二进制数x[N-1:0]其有符号形式的物理值(数学运算带入的值)为

\[x=-x[N-1]2^{N-1}+x[N-2]2^{N-2}+...+x[0]2^0 \]

这里唯一需要注意的是,最高位作为符号位,其位权为负,其余为正。
比如,
\(011=-0*2^2+1*2^1+1*2^0=+3\);
\(111=-1*2^2+1*2^1+1*2^0=-1\)

2. 原码

无符号数:

\[x=x[N-1]2^{N-1}+x[N-2]2^{N-2}+...+x[0]2^0 \]

有符号数:
符号位决定正负,后边为那个数的绝对值.比如,-3=111,第一个1代表负号,后边的11为3

\[x=(正或负,由符号位决定)x[N-2]2^{N-2}+...+x[0]2^0 \]

3. 符号位扩展:
对一个补码形式有符号数进行符号位扩展,其值不变。举个例子,11000=1000
4. 补码加法
对两个位宽不相等的有符号数进行加法运算,需要进行符号位扩展
如 \(a=5'b10011,b=3'b101\),二者都是补码形式,对应的十进制为\(-13\)和\(-3\). 在二者做加法时,先把位宽较短的\(b\)扩展为5位有符号数,即\(a=5'b10011,b=5'b11101\),然后运用二进制加法,结果为6位。

\[\begin{array}{rrrrrr} & & 1 & 0 & 0 & 1 & 1 \\ + & & 1 & 1 & 1 & 0 & 1 \\ \hline & 1 & 1 & 0 & 0 & 0 & 0 \\ \end{array}\]

运算结果按照补码解释,结果为\(-2^5+2^4=-16\),结果正确。这里其实可以注意到,\(10000\)表示的也是\(-16\),运算结果进行了符号位扩展,这样是为了避免溢出。
5. 补码乘法
还拿之前的例子,3位数乘5位数.这里先给出计算过程以及运算方法,随后介绍这么做的原理,不关心原理的同学可以只看计算过程。

\[\begin{array}{rrrrrrrrr} & & & & 1 & 0 & 0 & 1 & 1 \\ \times & & & & & & 1 & 0 & 1 \\ \hline & \textcolor{red}{1} & \textcolor{red}{1} & \textcolor{red}{1} & 1 & 0 & 0 & 1 & 1 \\ & \textcolor{red}{0} & \textcolor{red}{0} & 0 & 0 & 0 & 0 & 0 & \\ & \textcolor{#0f00f0}0 & \textcolor{#0f00f0}0 & \textcolor{#0f00f0}1 & \textcolor{#0f00f0}1 & \textcolor{#0f00f0}0 & \textcolor{#0f00f0}1 \\ \hline 1 & 0 &0 &1 &0 &0 &1 &1 &1 \end{array}\]

抹去溢出的第一个数字,剩余为\(00100111\)看作补码,为\(39\),恰好是\(-13 \times -3 = 39\)
将b的每一位与a相乘,结果为补码形式,扩展符号位到总共8位宽度。最后一行蓝色部分比较特殊,如果b的符号位为1,则将乘之后的结果10011全部取反,然后加一,扩展1位符号位后写在最下边,否则就直接全部写0即可。运算结果截断为(5+3)=8位。我们这里直接截断而不考虑溢出,是因为我们可以通过补码的表示范围判断出,N位有符号数乘以M位有符号数时,结果取N+M位时一定不会溢出。其实取M+N-1位也一定不会溢出(我感觉)。
原理部分:
暂时不想写了.jpg

参考链接:
https://www.zhihu.com/question/309627605
有符号数乘法运算

标签:运算,符号,0f00f0,补码,textcolor,red,乘法
From: https://www.cnblogs.com/jiaotaiyang/p/17576277.html

相关文章

  • 乘法逆元
    在数论中,如果a和m是正整数,且它们互质,那么a在模m意义下的逆元是一个正整数x,满足ax≡1(modm)。也就是说,x是一个整数,满足ax除以m的余数为1。求解a模m意义下的逆元有多种方法,其中一种常见的方法是使用快速幂算法。以下是使用快速幂算法求解a模m意义下的逆元的示例代码:int64_tmo......
  • 矩阵乘法指数的基域不变性
    昨天意识模糊的时候突然想到了这个东西如何证明,重新发明了一遍.对于域\(F\),我们记\(\omega(F)\)为在域\(F\)上的矩阵乘法的张量秩给出的\[\omega(F)=\inf_{n}\frac{\logR(\langlen,n,n\rangle)}{\logn},\]我们知道,对于无限域\(F\)来说,这本质刻画了矩阵乘......
  • android表情包符号和表情包图片一套
    科普文章:Android表情包符号和表情包图片一套引言在手机通讯软件和社交媒体应用中,表情包已经成为人们表达情感和沟通的重要方式之一。Android系统作为最受欢迎的移动操作系统之一,提供了丰富的表情包符号和表情包图片。在本文中,我们将详细介绍Android表情包的使用和开发。表情包符......
  • java 去除字符串中的特殊符号
    Java去除字符串中的特殊符号在Java编程中,我们经常需要处理字符串,有时候字符串中包含一些特殊符号,例如标点符号、空格、换行符等。在某些情况下,我们需要从字符串中去除这些特殊符号,只保留有效的字符。本文将介绍如何使用Java代码去除字符串中的特殊符号。1.使用正则表达式去除特......
  • java: 找不到符号 符号: 类 SampleAqlQuantizer 位置: 程序包 com.si.model.entit
    解决"java:找不到符号符号:类SampleAqlQuantizer位置:程序包com.si.model.entit"的问题作为一名经验丰富的开发者,我将指导你解决这个问题。首先,我们需要了解整个解决问题的流程。下面是一个表格展示了步骤和对应的操作:步骤操作1.检查类的包名和导入的包是否正确......
  • java: 找不到符号 符号: 方法 findSql6(java.util.Map<java.lang.String,java.lan
    解决"java:找不到符号符号:方法findSql6(java.util.Map<java.lang.String,java.lan"错误作为经验丰富的开发者,当遇到编译错误时,我们需要仔细分析错误信息并采取相应的解决方法。在这个任务中,我们需要解决"java:找不到符号符号:方法findSql6(java.util.Map<java.lang.St......
  • python替换特殊符号
    Python替换特殊符号在Python的字符串处理中,有时候需要替换特殊符号,例如删除或替换字符串中的标点符号、空格等。本文将介绍如何使用Python来替换特殊符号,并提供代码示例来帮助读者更好地理解。什么是特殊符号特殊符号是指在文本中具有特殊含义的字符,例如标点符号、空格、制表符......
  • 利用for循环实现乘法表、三角形
    publicclassChengfademo{publicChengfademo(){}publicstaticvoidmain(String[]args){for(inti=1;i<=9;++i){for(intj=1;j<=i;++j){System.out.print(i+"*"+j+"......
  • Matlab中的偏最小二乘法(PLS)回归模型,离群点检测和变量选择|附代码数据
    全文下载:http://tecdat.cn/?p=22319最近我们被客户要求撰写关于偏最小二乘法(PLS)回归的研究报告,包括一些图形和统计输出。本文建立偏最小二乘法(PLS)回归(PLSR)模型,以及预测性能评估。为了建立一个可靠的模型,我们还实现了一些常用的离群点检测和变量选择方法,可以去除潜在的离群点和只......
  • url中的参数带有&连接符号处理
     keyword:url参数 连接符  %26代替&,  %3F代替?   接受页面不需要改动任何, &的asc码为%26. ?的asc码为%3F. 如:toUrlProject.action?url=nonTopicDetailPlanTask.action%3FprojectInfo.id='+@moduleId+'%26menuId=26......