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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 江南小道士 中级黑马   /  2014-11-10 09:34  /  3465 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 江南小道士 于 2014-11-17 21:16 编辑

class Demo2
{
        public static void main(String[] args)
        {
                int x = 52428 ;//二进制为0000-0000 0000-0000 1100-1100 1100-1100
                x = x << 16 ;
                System.out.println("x="+x);
                //结果为:x = -859045888

                int y = -858993460 ; //二进制为1100-1100 1100-1100 1100-1100 1100-1100
                y = y << 2 ;
                System.out.println("y="+y);
                //结果为:y = 858993456
        }
}
既然这样,那使用左移的时候要不要注意一点。
大家一般都是什么情况下使用这个。望指教。

评分

参与人数 1黑马币 +1 收起 理由
杨佳名 + 1

查看全部评分

7 个回复

倒序浏览
之所以出现这个问题,是因为你左移的位数太多了,导致数据溢出
左移n位等于乘以2的n次方,你看看你移了多少位?已经超出了int型范围
回复 使用道具 举报 2 0
比如说你00001010-00000000-00000000-00000000左移四位不就成了1010 0000--....00000000变成负数了吗,
左移代表*2^n方,当你定义的数据类型是int型时,它的范围只能为4个字节也就是 -2^31---2^31-1,
原来的数*2^n的结果超过了这个范围就会出现问题
回复 使用道具 举报
哥们 左移要注意你变量的取值范围 还要注意左移前后的符号有没有变化 嗯........只会这么点了
回复 使用道具 举报
左移相比正常的运算符,java底层进行运算的效率高
回复 使用道具 举报
因为它直接操作的是字节,底层进行运算的次数少
回复 使用道具 举报
学习学习 都很厉害
回复 使用道具 举报
聪明叉 发表于 2014-11-10 09:54
之所以出现这个问题,是因为你左移的位数太多了,导致数据溢出
左移n位等于乘以2的n次方,你看看你移了多少 ...

噢,明白了,相乘后超出int范围了,没注意这个,多谢。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马