今天无意中发现一个怪事,当时没理解,后来跟网友讨论了才知道原理,是关于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

java int stack_java中int算法的有趣现象相关推荐

  1. java integer == int_Java中int和Integer的区别详解

    1.Java 中的数据类型分为基本数据类型和复杂数据类型 int是前者>>integer 是后者(也就是一个类) 2.初始化时>> int i =1; Integer i= n ...

  2. mysql int zerofill_Mysql 中int[M]—zerofill-阿里云开发者社区

    我们在定义数字类型的数据类型的时候,往往考虑该数字类型的数据能否装的下该字段的最大值,如状态位的字段:tinyint,表的主键:int,或者bigint,今天在看到开发同学提交表结构设计文档中看到数值 ...

  3. mysql int tinyint_MySQL中int(M)和tinyint(M)数值类型中M值的意义

    首先,我们创建一个数据表test: mysql> CREATE TABLE test( -> id1 int(1), -> id2 tinyint(1) ->); 我们给id1 ...

  4. 关于mysql中int(1)中int后面的数字

    mysql在建表的时候int类型后的长度代表什么? 是该列允许存储值的最大宽度吗? 为什么我设置成int(1), 也一样能存10,100,1000呢.   当时我虽然知道int(1),这个长度1并不代 ...

  5. java改写weka中的算法_用Eclipse在Weka中嵌入新算法

    本文介绍添加一个新算法到Weka集成环境中的过程,并能在GUI中运行并显示其结果.想做到这一点有两种方法,一是用ANT命令生成新的weka.jar(稍后写教程),二是用IDE(Eclipse或NetB ...

  6. unsigned int mysql_mysql 中int类型字段unsigned和signed的探索

    转自:http://www.0791quanquan.com/news_keji/topic_816453/ 探索一:正负数问题 拿tinyint字段来举例,unsigned后,字段的取值范围是0-2 ...

  7. html img属性text,TextField的htmlText属性中img标签的有趣现象

    Flash的文字栏位(TextField)除了用来显示与输入一般文字之外 也有支持简单的HTML标签 像是, , , , , , , , ,   其中比较特别的是,除了可以用来表现外部图片以外 还可以 ...

  8. java 数值越界的判断_java 中int 范围越界校验算法

    LeetCode上老有String 或者 char[]转int的算法,在计算之前需要分析计算是否会超过int 的范围,自己写了一个算法mark 一下.该算法用于       高位乘10 并加低位    ...

  9. java 中int 范围越界校验算法

    LeetCode上老有String 或者 char[]转int的算法,在计算之前需要分析计算是否会超过int 的范围,自己写了一个算法mark 一下.该算法用于       高位乘10 并加低位    ...

最新文章

  1. 对《Clojure in Action》第二版的书评与作者问答
  2. golang中的读写锁
  3. LinkedList详解,看这篇就够了
  4. vscode或cmd:无法将“git”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确
  5. w10恢复出厂设置_路由器如何恢复出厂设置
  6. 单文件图片管理php,php封装的单文件(图片)上传类完整实例
  7. java 判断字符串是否是整数
  8. WF4.0 基础篇 (二十五)(补充) ActivityFunc 与 InvokeFunc
  9. 增加一个输出,解决一个奇怪的死机
  10. 【月径流预测】基于matlab人工生态系统算法优化BP神经网络月径流预测【含Matlab源码 2000期】
  11. AHRS互补滤波(Mahony)算法及开源代码
  12. iphone7 无法连接计算机看照片,教你iphone7一键导出照片至电脑方法及iPhone7连接电脑itunes没反应怎么办...
  13. go语言处理html文件,go语言操作文件实例笔记
  14. 英语语法高考英语单词拼写必背全表
  15. 解决windows 10在联网时依旧无法安装3DMAX2014
  16. python天天向上的力量三天打鱼两天晒网_017 示例3-天天向上的力量
  17. 【转贴】古代四大名琴
  18. 笔记本计算机故障排除,笔记本电脑开机黑屏的原因及故障排除方法
  19. 调用MapReduce对文件中各个单词出现的次数进行统计
  20. js,提示,eclipse

热门文章

  1. JAVA变量初始化赋值null
  2. Java核心技术卷1: 多线程
  3. Android学习系列(27)--App缓存管理
  4. SDL 从内存流中加载图像并显示
  5. DevExpress之TreeList用法
  6. [转]Android编程之BitmapFactory.decodeResource加载图片缩小的原因及解决方法
  7. mysql5.6.24安装perl,linux下perl操作MySQL数据库(需要安装DBI)
  8. c语言入门敲打,C语言基础三(敲打键盘、寻找资料,循环语句)
  9. python开发网络程序教程_python3编写C/S网络程序实例教程
  10. Fiddler工具工作原理