java int stack_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
java int stack_java中int算法的有趣现象相关推荐
- java integer == int_Java中int和Integer的区别详解
1.Java 中的数据类型分为基本数据类型和复杂数据类型 int是前者>>integer 是后者(也就是一个类) 2.初始化时>> int i =1; Integer i= n ...
- mysql int zerofill_Mysql 中int[M]—zerofill-阿里云开发者社区
我们在定义数字类型的数据类型的时候,往往考虑该数字类型的数据能否装的下该字段的最大值,如状态位的字段:tinyint,表的主键:int,或者bigint,今天在看到开发同学提交表结构设计文档中看到数值 ...
- mysql int tinyint_MySQL中int(M)和tinyint(M)数值类型中M值的意义
首先,我们创建一个数据表test: mysql> CREATE TABLE test( -> id1 int(1), -> id2 tinyint(1) ->); 我们给id1 ...
- 关于mysql中int(1)中int后面的数字
mysql在建表的时候int类型后的长度代表什么? 是该列允许存储值的最大宽度吗? 为什么我设置成int(1), 也一样能存10,100,1000呢. 当时我虽然知道int(1),这个长度1并不代 ...
- java改写weka中的算法_用Eclipse在Weka中嵌入新算法
本文介绍添加一个新算法到Weka集成环境中的过程,并能在GUI中运行并显示其结果.想做到这一点有两种方法,一是用ANT命令生成新的weka.jar(稍后写教程),二是用IDE(Eclipse或NetB ...
- unsigned int mysql_mysql 中int类型字段unsigned和signed的探索
转自:http://www.0791quanquan.com/news_keji/topic_816453/ 探索一:正负数问题 拿tinyint字段来举例,unsigned后,字段的取值范围是0-2 ...
- html img属性text,TextField的htmlText属性中img标签的有趣现象
Flash的文字栏位(TextField)除了用来显示与输入一般文字之外 也有支持简单的HTML标签 像是, , , , , , , , , 其中比较特别的是,除了可以用来表现外部图片以外 还可以 ...
- java 数值越界的判断_java 中int 范围越界校验算法
LeetCode上老有String 或者 char[]转int的算法,在计算之前需要分析计算是否会超过int 的范围,自己写了一个算法mark 一下.该算法用于 高位乘10 并加低位 ...
- java 中int 范围越界校验算法
LeetCode上老有String 或者 char[]转int的算法,在计算之前需要分析计算是否会超过int 的范围,自己写了一个算法mark 一下.该算法用于 高位乘10 并加低位 ...
最新文章
- 对《Clojure in Action》第二版的书评与作者问答
- golang中的读写锁
- LinkedList详解,看这篇就够了
- vscode或cmd:无法将“git”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确
- w10恢复出厂设置_路由器如何恢复出厂设置
- 单文件图片管理php,php封装的单文件(图片)上传类完整实例
- java 判断字符串是否是整数
- WF4.0 基础篇 (二十五)(补充) ActivityFunc 与 InvokeFunc
- 增加一个输出,解决一个奇怪的死机
- 【月径流预测】基于matlab人工生态系统算法优化BP神经网络月径流预测【含Matlab源码 2000期】
- AHRS互补滤波(Mahony)算法及开源代码
- iphone7 无法连接计算机看照片,教你iphone7一键导出照片至电脑方法及iPhone7连接电脑itunes没反应怎么办...
- go语言处理html文件,go语言操作文件实例笔记
- 英语语法高考英语单词拼写必背全表
- 解决windows 10在联网时依旧无法安装3DMAX2014
- python天天向上的力量三天打鱼两天晒网_017 示例3-天天向上的力量
- 【转贴】古代四大名琴
- 笔记本计算机故障排除,笔记本电脑开机黑屏的原因及故障排除方法
- 调用MapReduce对文件中各个单词出现的次数进行统计
- js,提示,eclipse
热门文章
- JAVA变量初始化赋值null
- Java核心技术卷1: 多线程
- Android学习系列(27)--App缓存管理
- SDL 从内存流中加载图像并显示
- DevExpress之TreeList用法
- [转]Android编程之BitmapFactory.decodeResource加载图片缩小的原因及解决方法
- mysql5.6.24安装perl,linux下perl操作MySQL数据库(需要安装DBI)
- c语言入门敲打,C语言基础三(敲打键盘、寻找资料,循环语句)
- python开发网络程序教程_python3编写C/S网络程序实例教程
- Fiddler工具工作原理