补码一位乘法的c语言代码,定点数乘法运算:Booth算法(补码一位乘法)C 实现...
文章目录综述定点数的乘法运算Booth算法分析Booth算法的C实现
综述
在计算机中参与运算的机器数有两大类:无符号数和有符号数。
下面主要讲解有符号数:
在机器中,数的“正”、“负”号是无法识别的,有符号数用“0”表示正,用“1”表示负号,从而将符号数值化,并通常约定二进制数的最高位是符号位,即符号位放在有效数字的前面,组成有符号数。
有符号数的机器表示有原码、补码、反码和移码。
根据小数点的位置是否固定,在计算机中的有两种数据格式:定点表示和浮点表示。接下来我们将介绍的算法都是定点表示。
有关浮点数的内存存储及介绍请参考我的另一篇博文:
《浮点数在内存中的存储方式与运算陷阱》
定点表示即约定机器数中的小数点位置是固定不变的,小数点不再使用 “ . ” 表示,而是约定它的位置。理论上,小数点位置固定在哪一位都是可以的,但在计算机中通常采用两种简单的约定
将小数点的位置固定在数据的最高位之前,一般称为定点小数
将小数点的位置固定在数据的最高位之后,一般称为定点整数
定点小数是纯小数,约定小数点位置在符号位之后、有效数值部分最高位之前。
定点整数是纯整数,约定小数点位置在符号位有效数值部分最低位之后。
本文将介绍定点数的乘法运算。
定点数的乘法运算
在计算机中,乘法运算由累加和右移操作实现。根据机器数的不同,可分为
原码一位乘法
补码一位乘法
原码一位乘法的规则比补码一位乘法简单。我们下面主要介绍补码一位乘法(Booth)算法。
Booth算法分析
这是一种有符号数的乘法,采用相加和相减操作计算补码数据的乘积。
设 [X]补 = Xs.X1X2···Xn, [Y]补 = Ys.Y1Y2···Yn,则运算规则如下:
符号位参与运算,运算的数均以补码表示
被乘数一般取双符号位参与运算,部分积取双符号位,初值为0,乘数可取单符号位
乘数末尾增设附加位Yn+1,且初值为0
根据(Yn,Yn+1)的值来确定操作,具体见下表
移位按照补码右移规则进行
按照上述算法进行 n+1 步操作,但 n + 1 步不再移位(共进行 n + 1 次累加和 n次右移),仅根据Yn 与 Yn+1 的比较结果做相应的运算。

接下来我们分析一个实例:
设机器字长为5位(含一位符号位,n = 4),x = -0.1101,y = 0.1101,采用Booth算法求解 x · y。

Booth算法的C实现
通过上述分析,我们通过C语言来实现Booth算法。
问题描述:使用纯C实现Booth算法,不允许调用除输入输出外的其他功能库函数。
问题分析:
我们需要完成下述功能:
输入x、y,计算出 [X]补、[-X]补、 [Y]补
将X改为双符号位数
部分积取双符号位,初值为0
分割乘数,获取(Yn,Yn+1)的值
根据(Yn,Yn+1)的值执行相应操作
完整设计如下:
/**
* Copyright: Copyright(c) 2019
* Created on 26/4/2019
* Author : ZYZMZM
* Version 1.0
* Title : Booth Algorithm
**/
#include
/* 存储被乘数 x 的补码 */
char xCom[20] = { 0 };
/* 存储 -x 的补码 */
char mxCom[20] = { 0 };
/* 存储乘数 y 的补码 */
char yCom[20] = { 0 };
/* 存储乘数 y 末位增加 0 */
char multiNum[20] = { 0 };
/* 存储部分积的初值 */
char multiSrc[20] = { 0 };
/* 计算字符串长度 */
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
