本文来自: HeapDump性能社区
概述
之所以会写这个,主要是因为最近做的一个项目碰到了一个移位的问题,因为位移操作溢出导致结果不准确,本来可以点到为止,问题也能很快解决,但是不痛不痒的感觉着实让人不爽,于是深扒了下个中细节,直到看到Intel的指令规约才算释然,希望这篇文章能引起大家共鸣。
本文或许看起来会比较枯燥,不过其实认真看挺有意思的,如果实在看不下去,告诉你一个极简路径,先看下下面的Demo,然后直接跳到后面的小结,如果懂了,别忘记顺便点个赞,请叫我雷锋,哈哈。
Demo
还是从一个简单的例子说起
大家可以尝试做几个改变,看看结果怎样
-
4 << shift
改成4L << shift
-
将35改成291,PS:提示一下
291=25+256*1
如果上面的各种结果你都能解释,那说明你对位移操作还是有一定了解的,不过本文主要从JVM到Intel X86_64指令角度来分析这个问题,或许也值得一看
JVM里4和4L的区别
要知道区别,我们看doShiftL
方法通过javac编译出来的指令有什么不一样
4 << shift的字节码
0: iconst_4
1: iload_0
2: ishl
4L << shift的字节码
0