黑马程序员技术交流社区

标题: 位左移问题 [打印本页]

作者: 近夜之星    时间: 2013-11-1 22:29
标题: 位左移问题
在书上看了一道题:
  1. public class MultByTwo
  2. {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args)
  7.         {
  8.                 // TODO Auto-generated method stub
  9.                 int i;
  10.                 int num = 0xFFFFFFE;
  11.                 for(i=0;i<4;i++)
  12.                 {
  13.                         num = num << 1;
  14.                         System.out.println(num);
  15.                 }

  16.         }

  17. }
复制代码
输出结果:536870908
                1073741816
                2147483632
                -32
就想知道最后一个-32怎么得出的?求大神讲解下,谢谢



作者: 魏-玉-彪    时间: 2013-11-1 23:25
  1. public class MultByTwo
  2. {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args)
  7.         {
  8.                 // TODO Auto-generated method stub
  9.                 int i;
  10.                 int num = 0xFFFFFFE;/*
  11.                 1111111111111111111111111110
  12.                
  13.                
  14.                 */



  15.                 for(i=0;i<4;i++)
  16.                 {
  17.                         num = num << 1;
  18.                         System.out.println(num);
  19.                 }

  20.         }

  21. }



复制代码

268435454 = 0xFFFFFFE; //1111111111111111111111111110

536870908                    //11111111111111111111111111100
1073741816                 //111111111111111111111111111000
2147483632               //1111111111111111111111111110000
-32                          //11111111111111111111111111100000  最低位补0
请按任意键继续. . .


   这个输入的是十六进制,按位左移操作的二进制,输出的是十进制,十进制,二进制码
对应如上, 学习操作符的时侯会涉及到这个问题



作者: wangchao1686    时间: 2013-11-1 23:27
本帖最后由 wangchao1686 于 2013-11-1 23:41 编辑

在java中,基本数据类型int是32位的,就是占32个二进制位,所以int类型所能表示整数的范围也是有限制的.
int类型整数的表示的范围:
  2[sup]-31[/sup]~2[sup]31[/sup]-1 即:-2147483648~2147483647
所以嘛,你也看到了,左移一位相当于原数乘2,当右移三次时已经是2147483632,再一次左移岂不是已经超出int能够表达的最大正整数,导致结果爆掉

其实整数在内存中是通过二进制补码的方式进行表示的(关于数字的的原码,反码,补码问题可以参考相关书籍,老毕的视频中也有讲到,不会的可以再问我)
二进制补码中正数是0打头的,负数是1打头的
这个int型16进制数0xFFFFFFE的在内存中的表示为
0000-1111-1111-1111-1111-1111-1111-1110
第一次左移变成:
0001-1111-1111-1111-1111-1111-1111-1100
第二次左移变成:
0011-1111-1111-1111-1111-1111-1111-1000
第三次左移变成:
0111-1111-1111-1111-1111-1111-1111-0000
第四次左移变成:
1111-1111-1111-1111-1111-1111-1110-0000

注意最后的那个是1打头的,是一个负数,就是-32啦补码啦,表示成十进制当然就是-32啦





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