在写代码的时候,我们直接在没有编译报错的时候,直接点击运行后,ide会直接把程序的结果输出到控制台上,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| public static void main(String[] args) { int i=17; int j=5; int sum=i+j; System.out.println(sum); }
```
这段代码最终的结果是在控制台上面打印出:22,但是这个结果到底是怎么被执行的呢?
### CPU能做什么
在硬件的世界里面,只有0和1,就是这么简单的0和1,到底是怎么做加法的呢?
我们知道CPU的功能是执行指令,有三个简单的基本操作:与,非,或三种运算。在加上位的运算一种有5种:&,\|,~,<<,>>. 利用这个几个运算如何实现代码中的15+5的运算?
首先,把加法拆解,分成两个部分: 把个位和个位相加,如果有进1的话,就用进1的值十位与另一个十位相加。得到的和在进行相加。
1. 把15+5进行拆解就是 7+5=12,发现5+5有进位10; 2. 利用进位的十位与10+10 =20 3. 再把两个的和相加,20+2=22 ,没有再进位,运算结束。
根据上面的分析,我们可以使用递归的方法,写出加法的位运算代码如下:
``` Java static int add(int i, int j){ if(j == 0) return i; int sum = i ^ j; int carry = (i & j) << 1; return add(sum, carry); }
|
对这个算法进行封装成一个CPU指令,我们就可以利用二进制进行进行运算。
Java代码最终的编译结果
我们知道Java的代码最终是经过编译器,转换成字节码最终由JVM解释执行,具体过程如下:
当Java代码最终转换成字节码的时候,JVM虚拟机执行对应的字节指令,最终传递给CPU来执行代码,CPU计算的过程我们已经分析过,最终会调用位运算来实现加法。