Welcome

首页 / 软件开发 / 汇编语言 / 计算机系统原理(九) 二进制整数的加法运算和减法运算

计算机系统原理(九) 二进制整数的加法运算和减法运算2014-08-222.3我们介绍了无符号编码和补码编码,本次我们来看一下在这两种编码下,整数的运算是如何进行的。看后之余,别忘了“点个推荐哦。”

引言

平时的编程过程中,当进行整数运算时,经常会遇到一些奇怪的结果,比如两个正数加出负数,两个负数可以加出一个正数,这些都是由于数值表示的有限性导致的。下面我们来看看C语言和Java语言当中的例子。

public static void main(String[] args) {int a = 0x7FFFFFFF;int b = 0x7FFFFFFF;System.out.println(a);System.out.println(b);System.out.println( a + b );}
程序当中的a和b都是很大的正整数,结果它们相加会得到一个负数。

接下来我们再来看看C语言当中的例子,它也会具有同样的特性。

#include <stdio.h>int main(){int a = 0x7FFFFFFF;int b = 0x7FFFFFFF;printf("%d
",a);printf("%d
",b);printf("%d
",a+b);}

我们来看看这个程序的结果,是否与Java一致。

可以看到,在C于Java当中,结果都是一样的,所以我们有必要对二进制整数的运算做一些简单的了解。

无符号加法

这里LZ不想按照书中的方式去介绍,我们换一种思路,来简单的了解一下吧。

小时候学习加法时,我们都是使用的画表式,就是上面是被加数,下面是加数,然后左边写一个加号,逢10就进1,然后下面画一条横线,横线下面就是我们的结果。

对于我们的二进制整数来说,其实也可以使用这种最原始的方式去计算,由此也可以认识到,二进制整数的加法也是非常简单的。只不过它与我们平时的十进制算法有一个最大的区别,那就是我们在计算机当中进行计算时,结果的位数都是有限制的。因此在我们计算过后,可能需要对结果进行截断操作。

前面一章我们已经讲过有关截断的内容,那么很明显这里就可以用上了。这里使用的时候有一个前提,我们可以假设是进行w位的二进制运算,那么在运算之后的实际结果也一定是w位的。这里有两种情况,一种是结果依然是w位的,也就是w+1位为0。第二种则是达到了w+1位,这个时候我们需要将结果截断到w位。

第一种情况则属于正常的加法运算,对于第二种来说,我们根据上一章的结论可以得到,假设完整的结果为sum,则实际的结果最终为 sum mod 2w。

在书中则是给出了一个公式,它得到这个结果的一个前提是两个操作数都满足小于2w,它与我们上面取模的结果其实是一样的。

这里LZ再稍微解释一下,对于第一种情况,x+y < 2w,则sum mod 2w是与sum一致的。对于第二种来说,当 2w =< x+y < 2w+1,对 x + y 进行2w的取模运算,与 x + y - 2w是等价的。