A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

为什么100 << 64?等于100. 而100 <<62 却等于0??

15 个回复

倒序浏览
应该是int范围的问题吧
回复 使用道具 举报
我觉得这就应该是int类型数据溢出造成的
100<<64 相当于 100*2^64
而int类型数据的取值范围是-[2^31]~~[(2^31)-1]
100*2^64 绝对溢出,
32-64=-32(为什么上面是31这里是32呢?       0到31是32个数)
-32-(-32)=0
所以100*2^64 = 100*2^0 = 100
后面的那条也是类似
回复 使用道具 举报
计算机识别的是二进制的编码。你用二进制换算一下
回复 使用道具 举报
看不懂,感觉好难
回复 使用道具 举报
Phy_zhang 发表于 2015-11-16 19:09
我觉得这就应该是int类型数据溢出造成的
100

胡说八道
回复 使用道具 举报
int 类型的整数是32位的,左移或右移32位或32的倍数,数值不变。所以左移33位,相当于左移1位。
long类型的整数是64位的,左移或右移64位或64位的倍数,数值不变。
记住就行
回复 使用道具 举报 1 0
你是对的 发表于 2015-11-21 09:40
int 类型的整数是32位的,左移或右移32位或32的倍数,数值不变。所以左移33位,相当于左移1位。
long类型的 ...

感谢回复正解。实验了一下,确实如此。
回复 使用道具 举报

你的回答记住就行,那么你知道原理码?
不知道原理我给你记得再清楚也只是井底蛙
回复 使用道具 举报

敢问知道什么是计算机数据溢出吗?
回复 使用道具 举报
Phy_zhang 发表于 2015-11-22 19:45
敢问知道什么是计算机数据溢出吗?

我不知道  
来解释下100<<32怎么溢出的
回复 使用道具 举报
赞赞赞赞赞
回复 使用道具 举报
我只知道int类型周期是2^32,具体的算法就不多说了,太麻烦
回复 使用道具 举报
位移运算是一个循环
回复 使用道具 举报
我一直以为超出范围不变值的
回复 使用道具 举报
两个的移位会以移动出去的数字补位,int类型整数是32位。
100移动64位刚好是循环回来,所以值还是100。
我把移位完整的打印出来,代码是
class Demo {
        public static void main(String[] args) {
for(int x=1;x<=32;x++)
{
System.out.println("当X="+x+"时");

        int b=100<<x;
System.out.println(Integer.toBinaryString(b));
System.out.println(b);
System.out.println(x);
}
        }
}
结果当移位26位,即第一次首位是1移出去的时候后面是补0,所以左移30或者31都是0,因为所得的数是32个0;

2015-11-24 (1).jpg (37.81 KB, 下载次数: 35)

2015-11-24 (1).jpg
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马