64位长整数的加减法
S7200和200smart,只有16位、32位的整数加减指令。
8位的加减,可以用16位的指令,然后只截取8位的结果;
24位的加减,可以使用32位的指令,然后只截取24位的结果。
大于32位的整数加减,则没有现成的指令可用,需要编程实现。
国庆假期有空,整理了一下64位的加减法的实现办法。有了64位,中间的40位、48位、56位,都可以实现了。
方法,分无符号和有符号两种,但是都是基于系统提供的32位有符号加减指令实现。
一、无符号和有符号的统一
200的整数加减指令是有符号的,编码规则采用补码法。补码法的好处,是可以使用无符号数的加减指令,来实现有符号数的加减,也就是说,有符号和无符号的加减指令,计算法则是一样的,所不同者,只是数值的解释不同。
为叙述方便,以3位二进位长的整数为例。最高有效位(MSB)表示符号:
二进制编码:100 101 110 111 000 001 010 011
十进数数值:-4 -3 -2 -1 0 1 2 3
注意,2#100不是-0。
有符号:(-4)+(1)=-3,二进制:(100)+(001)=101(=-3)
无符号:(4)+(1)=5,二进制:(100)+(001)=101(=5)
有符号:(-1)+(1)=0,二进制:(111)+(001)=000(溢出)
无符号:(7)+(1)=0,二进制:(111)+(001)=000(溢出)
可以自行试一下减法。
所以,无符号数,可以采用有符号数的指令进行运算,把结果按无符号解释,就可以了。
反之亦然。
二、64位无符号数的加减法
64位分高32位L64H和L64L,按计算法则,先算低位先算。低位计算时,会产生进位和借位,一同参与高位的计算。
所以,长整数的计算关键,就是处理进位和借位。
2.1 加法
把L64L的最高有效位标为MSBL,加数的称为MSBL1,被加数的称为MSBL2,和称为MSBL3
若 (MSBL1) or (MSBL2) = 0,也就是全为0,肯定没有进位产生。
若 (MSBL1) and (MSBL2) = 1,也就是全为1,则肯定有进位产生了。
若 ((MSBL1) or (MSBL2) = 1) and (MSBL3=0),也就是加数的MSB至少有一个1,但是和的MSB=0,也表示有进位产生。
2.2 减法
A-B=A+(-B)
所以,减法可以用加法做。
-B,按补码的编码规则,是将B的二进位取反,然后加1。
-B=INV(B)+1
三、64位有符号数的加减法
有符号数的加减法,规则同无符号数。只要有显示或应用时,把数解释成有符号的就行了。
这是理论。再写程序。