三、用16位算术电路进行32位算术运算

  (一)32位加减运算
    32位加减运算是分别对高16位与低16位进行加减运算,然后把两次运算的结果合并成一个32位数据。
    1、32位无符号加法运算。把两个32位操作数都分成高16位与低16位,分别对两个高16位及两个低16位进行加法运算,在得到高16位与低16位的加法运算结果后,把高16位运算结果与低16位运算结果合并成一个32位数。合并方法是:检测低16位运算结果的进位位,如果进位位为0,把高16位运算结果与低16位运算结果合并成一个32位数;如果进位位为1,高16位运算结果加1,把加1后的高16位运算结果与低16位运算结果合并成一个32位数;高16位运算结果的进位标志为合并数据的进位标志。
    2、32位有符号加法、有符号减法、无符号减法运算。把两个32位操作数都分成高16位与低16位,每个操作数的高16位与低16位的符号标志均为该32位操作数的符号标志,分别对两个高16位及两个低16位进行运算,在得到高16位与低16位的运算结果后,把高16位运算结果与低16位运算结果合并成一个32位数。合并方法是:首先检测高16位运算结果与低16位运算结果的符号是否相同。 
    (1)如果符号相同,高16位运算结果的进位标志为合并数据的进位标志;检测低16位运算结果标志中的进位位,如果进位位为0,把高16位运算结果与低16位运算结果合并成一个32位数;如果进位位为1,高16位运算结果加1,把加1后的高16位运算结果与低16位运算结果合并成一个32位数。
    (2)如果符号相异,检测高16位的运算结果是否为0,如果高16位运算结果为0,把高16位的运算结果与低16位的运算结果合并成一个32位数,运算结果的符号标志为低16位运算结果的符号标志;如果高16位的运算结果不为0,把低16位运算结果的数据翻转,把高16位运算结果的数据减1,把减1后的高16位运算结果与翻转后的低16位运算结果合并成一个32位数,运算结果的标志为高16位运算结果的标志。
  (一)32位乘法、除法运算
    1、32位乘法运算。把两个乘法操作数都分成高16位与低16位两个数据,先把一个乘法操作数的高16位分别与另一个乘法操作数的高16位及低16位相乘,再把这个操作数的低16位分别与另一个乘法操作数的高16位及低16位相乘,然后用加法合并成一个64位的结果数。
    2、32位除以16位的除法运算。被除数是32位,除数是16位时,先用高16位进行除法运算,除商是32位整数,再用低16位进行除法运算,除商是16位整数与16位小数。把32位的除商整数结果与16位的除商整数结果用加法运算合并成一个32位整数,合并后的32位整数没有进位位,运算结果由32位整数与16位二进制小数组成。
    3、32位除以32位的除法运算
    (1)32位的除法运算是把一个32位除数转换成两个16位乘16位的除数,然后进行两次除法运算。由于16位数的最大数值是FFFFH,两个16位数相乘的最大值是FFFE0001H,因此,进行32位除法运算时,被除数与除数的最大数值不能大于FFFE0001H。进行除法运算前要先检测被除数与除数是否大于FFFE0001H,如果大于该数值就不能进行32位的除法运算。检测方法一是:把FFFE0001H做为被减数,两个32位的操作数做为减数,分别进行无符号减法运算,检测运算结果符号标志,只要两个运算结果标志中的符号标志位任意一个为1,就退出32位除法运算;反之,则运算继续进行。检测方法二是:把32位操作数的最大值限定到小于FFFDFFFFH的范围,用FFFDH做为被减数,两个操作数的高16位做为减数,分别进行无符号减法运算,检测运算结果符号标志,只要两个运算结果标志中的符号标志位任意一个为1,就退出32位除法运算;反之,则运算继续进行。
    FFFDFFFFH的10进制数值为4294836223,单片机进行数据处理一般达不到这样大的数值,用户编程更清楚所处理数据的范围,如果数据处理的范围比10的9次方小几个数量级,可以不进行检测直接进入除法运算。
    (2)检测32位的除数是否为0,如果为0就退出运算。
    (3)把32位的除数转换成两个16位数相乘,两个16位数相乘的结果与32位除数相等。转换方法:设:32位的除数为A1,当A1/B1=C1时,有A1=B1*C1。令:B1=FFFFH,进行A1/B1运算,C1的运算结果用16位整数与16位小数表达,C1表达的数可以进行精度为16位的二进制倒数运算。
    (4)把32位的被除数也转换成两个16位数相乘。设:32位的被除数为A2,当A2/B2=C2时,有A2=B2*C2。令:B2=FFFFH,任意一个小于FFFE0001H的32位数除以B2后都可以得到一个小于FFFFH的16位数C2,C2用一个16位整数与一个16位小数表达。
    (5)设:32位除法运算为C=A2/A1,由于:A1=(FFFFH)*C1,A2=(FFFFH)*C2,有:32位的除法运算为:C=C2/C1。 
    C2由一个16位整数与一个16位小数两部分组成,令:C2=R1+R2,R1为整数部分,R2为小数部分。
    C1也由16位的整数部分与16位的小数部分组成,可以进行16位的倒数定点数计算,令:C1的倒数运算结果为R3。
    (6)32位的除法运算为:
    C=C2/C1
    =(R1+R2)*R3
    =R1*R3+R2*R3
    R1*R3的运算结果为一个32位整数数,设:运算结果的高16位为R4,低16位为R5。
    R2*R3的运算结果为一个16位整数与16位小数,设:16位整数为R6,小数为R7。
   把R1*R3与R2*R3的运算结果合并成一个32位整数与一个16位小数。合并过程是:R5+R6为合并后的低16位整数,R5加R6的进位位与R4相加为合并后的高16位整数,高16位没有进位位。R7为16位小数。
    4、32位除32位运算的快捷方法
    由上述32位除32位的运算知,32位除法运算是把被除数转换成B2与C2两个16位数据,B2*C2等于被除数,把除数转换成B1*C1,B1*C1等于除数。当B1=B2时,32位的除法运算就成了C2/C1的运算。
    既然B1与B2可以是FFFFH,由于它没有参加运算,B1与B2只要不小于FFFFH就行。令B1=B2=10000H,被除数与除数都是右移16位。由于不再进行32位除16位的运算分解被除数与除数,也就不需要对被除数与除数是否大于FFFE0001H进行检测了。32位除32位快捷运算过程如下:
   (1)检测除数是否为0,为0时退出
   (2)把32位除数的高16位做为16位整数,把低16位做为16位小数,进行倒数运算。
   (3)把32位被除数的高16位做为16位整数,把低16位做为16位小数,分别与除数的倒数运算结果进行乘运算。16位整数与除数的倒数运算结果相乘后得到32位的整数运算结果。16位小数与除数的倒数运算结果相乘后得到16位整数与16位小数。
   (4)把两次运算结果合并成整数与小数两个部分,整数部分为32位,小数部分为16位。
 返回上页
 返回首页