黑马程序员技术交流社区

标题: 一个关于移位的问题 [打印本页]

作者: 明锦添    时间: 2013-3-13 23:26
标题: 一个关于移位的问题
本帖最后由 黄玉昆 于 2013-3-16 07:14 编辑

package com.soft.test;


public class Test3 {

        public static void main(String[] args) {
                int i = 1;
                int number = i << 100;
                System.out.println(number);
        }
}

得到的number竟然是16,不知道为什么。。{:soso_e132:}


作者: 杨博    时间: 2013-3-13 23:36
int 数据最高值为2的31次方-1,你这个应该是越界造成
作者: fighting    时间: 2013-3-13 23:39
int类型是32位的,它只会移动32位以内的位数吧,
所以取一下余数,就是左移4位了,猜的,不知道是不是这么回事
大家给点意见哈
作者: 我自信我很牛    时间: 2013-3-13 23:41
int只有32位 00000000  00000000  00000000  000000001移动一百次,32轮了三圈,然后落到第四个 32*3+4=100,所以就是16了。
作者: Benwolf0818    时间: 2013-3-13 23:48
int的取值范围是-2147483648~2147483647
1<<100这可是一个天文数字,数字越界。
0~ 31
32~ 63
64~ 95
96~100
值越界后会重新从头开始,也就是以32为长度的循环,i>>1与i>>33值都是一样的
作者: 谢洋    时间: 2013-3-13 23:48
楼上正解
a、<<左移,最底位补什么由原有数据的最底位而定
b、>>右移,最高位补什么由原有数据的最高们值而定

作者: 孙宁    时间: 2013-3-13 23:51
在张孝祥老师的书上曾经提过,对于int整形移位a<<b位,系统会先将b对32取模,得到的结果才是真正移的位数。100对32取余得4,  1左移四位结果就是16
作者: 于腾飛    时间: 2013-3-13 23:58
Int数据类型是32位,你定义int i=1,就是0000-0000 0000-0000 0000-0000 0000-0001 左移100位,相当于乘以2的100次幂,应该越界报错吧
作者: 小路飞    时间: 2013-3-14 01:04
烟磊磊 发表于 2013-3-13 23:41
int只有32位 00000000  00000000  00000000  000000001移动一百次,32轮了三圈,然后落到第四个 32*3+4=100 ...

是循环移位的缘故啊!
作者: amen0205    时间: 2013-3-14 05:29
小知识点  我也知道了




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