java中1左移超过32位的问题

for (int i = 1; i <42 ; i++) {
            int number= 1 << i;
            System.out.println("i:"+i+"**number:"+number);
}

结果为:

i:1**number:2
i:2**number:4
i:3**number:8
i:4**number:16
i:5**number:32
i:6**number:64
i:7**number:128
i:8**number:256
i:9**number:512
i:10**number:1024
i:11**number:2048
i:12**number:4096
i:13**number:8192
i:14**number:16384
i:15**number:32768
i:16**number:65536
i:17**number:131072
i:18**number:262144
i:19**number:524288
i:20**number:1048576
i:21**number:2097152
i:22**number:4194304
i:23**number:8388608
i:24**number:16777216
i:25**number:33554432
i:26**number:67108864
i:27**number:134217728
i:28**number:268435456
i:29**number:536870912
i:30**number:1073741824
i:31**number:-2147483648
i:32**number:1
i:33**number:2
i:34**number:4
i:35**number:8
i:36**number:16
i:37**number:32
i:38**number:64
i:39**number:128
i:40**number:256
i:41**number:512

左移的规则只记住一点:丢弃最高位,0补最低位

如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位。

但是:

int number=1;
for (int i = 1; i <42 ; i++) {
      number= number  << 1;
      System.out.println("i:"+i+"**number:"+number);
}

结果为:

i:1**number:2
i:2**number:4
i:3**number:8
i:4**number:16
i:5**number:32
i:6**number:64
i:7**number:128
i:8**number:256
i:9**number:512
i:10**number:1024
i:11**number:2048
i:12**number:4096
i:13**number:8192
i:14**number:16384
i:15**number:32768
i:16**number:65536
i:17**number:131072
i:18**number:262144
i:19**number:524288
i:20**number:1048576
i:21**number:2097152
i:22**number:4194304
i:23**number:8388608
i:24**number:16777216
i:25**number:33554432
i:26**number:67108864
i:27**number:134217728
i:28**number:268435456
i:29**number:536870912
i:30**number:1073741824
i:31**number:-2147483648
i:32**number:0
i:33**number:0
i:34**number:0
i:35**number:0
i:36**number:0
i:37**number:0
i:38**number:0
i:39**number:0
i:40**number:0
i:41**number:0

 

你可能感兴趣的:(java,jdk,jvm等)