黑马程序员技术交流社区

标题: 为什么100 << 64?等于100. 而100 <<62 却等于0?? [打印本页]

作者: ^梦圉^    时间: 2015-11-15 23:39
标题: 为什么100 << 64?等于100. 而100 <<62 却等于0??
为什么100 << 64?等于100. 而100 <<62 却等于0??
作者: JYcainiao    时间: 2015-11-16 16:23
应该是int范围的问题吧
作者: Phy_zhang    时间: 2015-11-16 19:09
我觉得这就应该是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
后面的那条也是类似
作者: Rocky_zhang    时间: 2015-11-20 22:07
计算机识别的是二进制的编码。你用二进制换算一下
作者: 她呆萌可爱    时间: 2015-11-21 00:34
看不懂,感觉好难
作者: 你是对的    时间: 2015-11-21 09:39
Phy_zhang 发表于 2015-11-16 19:09
我觉得这就应该是int类型数据溢出造成的
100

胡说八道
作者: 你是对的    时间: 2015-11-21 09:40
int 类型的整数是32位的,左移或右移32位或32的倍数,数值不变。所以左移33位,相当于左移1位。
long类型的整数是64位的,左移或右移64位或64位的倍数,数值不变。
记住就行
作者: tiandaochouqin    时间: 2015-11-22 09:03
你是对的 发表于 2015-11-21 09:40
int 类型的整数是32位的,左移或右移32位或32的倍数,数值不变。所以左移33位,相当于左移1位。
long类型的 ...

感谢回复正解。实验了一下,确实如此。
作者: Phy_zhang    时间: 2015-11-22 19:44
你是对的 发表于 2015-11-21 09:39
胡说八道

你的回答记住就行,那么你知道原理码?
不知道原理我给你记得再清楚也只是井底蛙
作者: Phy_zhang    时间: 2015-11-22 19:45
你是对的 发表于 2015-11-21 09:39
胡说八道

敢问知道什么是计算机数据溢出吗?
作者: 你是对的    时间: 2015-11-22 21:50
Phy_zhang 发表于 2015-11-22 19:45
敢问知道什么是计算机数据溢出吗?

我不知道  
来解释下100<<32怎么溢出的
作者: 小笨笨天    时间: 2015-11-22 21:55
赞赞赞赞赞
作者: z940505    时间: 2015-11-22 22:41
我只知道int类型周期是2^32,具体的算法就不多说了,太麻烦
作者: bbaijiajinger    时间: 2015-11-23 19:07
位移运算是一个循环
作者: 隔壁马良    时间: 2015-11-24 00:11
我一直以为超出范围不变值的
作者: 龙sama    时间: 2015-11-24 11:54
两个的移位会以移动出去的数字补位,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, 下载次数: 33)

2015-11-24 (1).jpg





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2