java中int算法,java中int算法的有趣現象

今天無意中發現一個怪事,當時沒理解,后來跟網友討論了才知道原理,是關於int值的加法算法,兩段代碼如下:

代碼1:

@Testpublic voidtest1() {int stackLength = 1;int count = 0;try{while(true){

count++;

stackLength+= stackLength; //每次打印的值為0

System.out.println("stackLength="+count+"次::"+stackLength);

}

}catch(Exception e) {

System.out.println("occur exception!!! stackLength="+stackLength);

}

}

控制台輸出結果很奇怪,全都是0,:

stackLength=21719次:: 0

stackLength=21720次:: 0

stackLength=21721次:: 0

stackLength=21722次:: 0

stackLength=21723次:: 0

stackLength=21724次:: 0

stackLength=21725次:: 0

……  由於打印太快,已經計算了2萬多次。

代碼2:

@Testpublic voidtest2() {int stackLength = 1;int count = 0;try{while(true){

count++;

stackLength+= 1;

System.out.println("stackLength="+count+"次:: "+stackLength);

}

}catch(Exception e) {

System.out.println("occur exception!!! stackLength="+stackLength);

}

}

控制台打印結果正常,是一個數一個數加上去的:

stackLength=21211次:: 21212

stackLength=21212次:: 21213

stackLength=21213次:: 21214

stackLength=21214次:: 21215

stackLength=21215次:: 21216

stackLength=21216次:: 21217

stackLength=21217次:: 21218

stackLength=21218次:: 21219

stackLength=21219次:: 21220

stackLength=21220次:: 21221

stackLength=21221次:: 21222

stackLength=21222次:: 21223

……

思路

這就很奇怪了,代碼1和代碼2中,只有一行代碼不一樣,

在代碼1中為stackLength += stackLength;

在代碼2中為stackLength += 1;

但是運行2萬多次后,結果卻大相徑庭。后來與網友討論才明白其中原理如下:

先說  i+=i 吧,二進制運算的知識。

初始值1  就是 0000 0000 0000 0000 0000 0000 0000 0001 ,

加自己就是  0000 0000 0000 0000 0000 0000 0000 0010.

0000 0000 0000 0000 0000 0000 0000 0010 + 0000 0000 0000 0000 0000 0000 0000 0010 就=2+2

結果就是 0000 0000 0000 0000 0000 0000 0000 0100 也就是4

一直到31次的時候,就變成  1000 0000 0000 0000 0000 0000 0000 0000這個值是最小負數。

因為 int是32位。當最高符號位超出32位,最后兩個最大的負數相加的時候,符號位也變成0了,后32位都是0,就是32個0,所以后面就一直是0了。

當是33位時,兩個最大負數相加,連33位都變成了0

因為int只能取32位

所以就是0

然后后面就一直是0+0了

好了,明白了這個道理,我們來看看是不是這樣的,首先把源碼改成如下:

例子3:

@Testpublic voidtest3() {int stackLength = 1;int count = 0;try{while(true){

count++;

stackLength+=stackLength;

System.out.println("stackLength="+count+"次:: "+stackLength);if(count > 40){break;

}

}

}catch(Exception e) {

System.out.println("occur exception!!! stackLength="+stackLength);

}

}

控制台打印如預期之中:

stackLength=1次:: 2

stackLength=2次:: 4

stackLength=3次:: 8

stackLength=4次:: 16

stackLength=5次:: 32

stackLength=6次:: 64

stackLength=7次:: 128

stackLength=8次:: 256

stackLength=9次:: 512

stackLength=10次:: 1024

stackLength=11次:: 2048

stackLength=12次:: 4096

stackLength=13次:: 8192

stackLength=14次:: 16384

stackLength=15次:: 32768

stackLength=16次:: 65536

stackLength=17次:: 131072

stackLength=18次:: 262144

stackLength=19次:: 524288

stackLength=20次:: 1048576

stackLength=21次:: 2097152

stackLength=22次:: 4194304

stackLength=23次:: 8388608

stackLength=24次:: 16777216

stackLength=25次:: 33554432

stackLength=26次:: 67108864

stackLength=27次:: 134217728

stackLength=28次:: 268435456

stackLength=29次:: 536870912

stackLength=30次:: 1073741824

stackLength=31次:: -2147483648

stackLength=32次:: 0

stackLength=33次:: 0

stackLength=34次:: 0

stackLength=35次:: 0

stackLength=36次:: 0

stackLength=37次:: 0

stackLength=38次:: 0

stackLength=39次:: 0

stackLength=40次:: 0

stackLength=41次:: 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值