黑马程序员技术交流社区

标题: 关于左移,是否会出现正负转变? [打印本页]

作者: 江南小道士    时间: 2014-11-10 09:34
标题: 关于左移,是否会出现正负转变?
本帖最后由 江南小道士 于 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
        }
}
既然这样,那使用左移的时候要不要注意一点。
大家一般都是什么情况下使用这个。望指教。
作者: 聪明叉    时间: 2014-11-10 09:54
之所以出现这个问题,是因为你左移的位数太多了,导致数据溢出
左移n位等于乘以2的n次方,你看看你移了多少位?已经超出了int型范围
作者: hanxing    时间: 2014-11-10 10:18
比如说你00001010-00000000-00000000-00000000左移四位不就成了1010 0000--....00000000变成负数了吗,
左移代表*2^n方,当你定义的数据类型是int型时,它的范围只能为4个字节也就是 -2^31---2^31-1,
原来的数*2^n的结果超过了这个范围就会出现问题
作者: Crazy_Eat_Code    时间: 2014-11-10 10:44
哥们 左移要注意你变量的取值范围 还要注意左移前后的符号有没有变化 嗯........只会这么点了
作者: zhangyangLengen    时间: 2014-11-10 12:03
左移相比正常的运算符,java底层进行运算的效率高
作者: zhangyangLengen    时间: 2014-11-10 12:04
因为它直接操作的是字节,底层进行运算的次数少
作者: M_______r    时间: 2014-11-10 12:13
学习学习 都很厉害
作者: 江南小道士    时间: 2014-11-10 15:08
聪明叉 发表于 2014-11-10 09:54
之所以出现这个问题,是因为你左移的位数太多了,导致数据溢出
左移n位等于乘以2的n次方,你看看你移了多少 ...

噢,明白了,相乘后超出int范围了,没注意这个,多谢。




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