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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 近夜之星 中级黑马   /  2013-11-1 22:29  /  1438 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在书上看了一道题:
  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怎么得出的?求大神讲解下,谢谢


评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

2 个回复

倒序浏览
  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
请按任意键继续. . .


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


评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 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啦

评分

参与人数 1技术分 +1 收起 理由
To + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马