本帖最后由 wangchao1686 于 2013-11-1 23:41 编辑
在java中,基本数据类型int是32位的,就是占32个二进制位,所以int类型所能表示整数的范围也是有限制的.
int类型整数的表示的范围:
2[sup]-31[/sup]~2[sup]31[/sup]-1 即:-2147483648~2147483647
所以嘛,你也看到了,左移一位相当于原数乘2,当右移三次时已经是2147483632,再一次左移岂不是已经超出int能够表达的最大正整数,导致结果爆掉
其实整数在内存中是通过二进制补码的方式进行表示的(关于数字的的原码,反码,补码问题可以参考相关书籍,老毕的视频中也有讲到,不会的可以再问我)
二进制补码中正数是0打头的,负数是1打头的
这个int型16进制数0xFFFFFFE的在内存中的表示为
0000-1111-1111-1111-1111-1111-1111-1110
第一次左移变成:
0001-1111-1111-1111-1111-1111-1111-1100
第二次左移变成:
0011-1111-1111-1111-1111-1111-1111-1000
第三次左移变成:
0111-1111-1111-1111-1111-1111-1111-0000
第四次左移变成:
1111-1111-1111-1111-1111-1111-1110-0000
注意最后的那个是1打头的,是一个负数,就是-32啦补码啦,表示成十进制当然就是-32啦
|