发表于 1 小时前
代码我敲了,跟我的理论是一致的,其实想也想的到,移位超过32之后还有意义吗,没有了!所以超过之后只要取它的低5位就可以了,要不然移位运算比加减乘除还要慢。
int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000
i = i << 1;
那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.
如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.
以上摘自一篇文章
红字的地方很好的解释了为什么2<<31位后会变成0的。
楼主我并没有否定你的结论,你说的是对的,只是问题似乎并没有你说的那么复杂而已。把1+1=2这样的问题描述的让博士都听的一头雾水就没必要吧,而把爱因斯坦的高深的相对论说的跟小孩子躲猫猫一样浅显易懂这才是深入浅出的最高境界,楼主你说对吧。
作者: xieshuhua 时间: 2012-6-3 21:43
1、javap可知引用了ishl- 0: bipush 12
- 2: istore_1
- 3: iload_1
- 4: bipush 32
- 6: ishl
- 7: istore_2
- 8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
- 11: iload_2
- 12: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
- 15: return
复制代码 2、查询JVM文档可知
-
JVM文档.png
(73.08 KB, 下载次数: 33)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |