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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吕婷 初级黑马   /  2012-2-29 17:22  /  2035 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吕婷 于 2012-2-29 19:17 编辑

今天看了视频,用制表转换进制,方法蛮简单,为了自己习惯,我编写的程序和老毕的有点点同,在转换正数时候都OK,负数时候就有错误。dos错误显示如下:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
        at Change.toBin_2(Change.java:100)
        at Change.main(Change.java:5)

我的程序如下:

public static void toBin_2(int num)
        {
                //制表
                char[] chs={'0','1'};

                //定义一个临时数组
                char[] arr=new char[32];      
                int pos=arr.length-1;            此处我将指针初始就在最高位,视频中是定义的pos=arr,length;

                while(num!=0)
                {
                        {
                         int temp = num&1;                                   
                                                 arr[pos--] = chs[temp];      视频中是arr[--pos]
                        num = num>>>1;
               
                        }
                }

                 //将存储好的数据遍历打印出来
                for (int x=pos;x<arr.length ;x++ )
                {
                        System.out.print(arr[x]);
                }
               
        }

和视频中只有红色两个地方不同,其他都是一样的。运行正数都没有问题,负数就不行了,十六进制同理也是这种现象。我觉得负数补码就是取反+1,但是位数应该还是32吧,为什么初始arr.length-1就不对了呢?谢谢大家解疑。

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

8 个回复

倒序浏览
  while(num!=0)
                {
                        {
                         int temp = num&1;                                   
                                                 arr[pos--] = chs[temp];   
                        num = num>>>1;
               
                        }
                }

问题在这里,你是负数的话,这个循环永远不会停下来,这样pos一直减,当然会角标越界啊
回复 使用道具 举报
李晓俊 发表于 2012-2-29 17:35
while(num!=0)
                {
                        {

但是为什么改成--pos就可以了呢?结果正确。
回复 使用道具 举报
arr[pos--] = chs[temp和下面的
//将存储好的数据遍历打印出来
                for (int x=pos;x<arr.length ;x++ )
                {
                        System.out.print(arr[x]);
                }

pos最后一次为零,如果是pos--,当pos为零的循环结束后,pos变为-1了,所以下面的for循环中让x=pos会出异常,
而--pos就不会,它是先取值再运算啊,,当pos为零时,那一次循环结束之后就是零,下面x=pos不会出异常

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 吕婷 于 2012-2-29 18:18 编辑
李晓俊 发表于 2012-2-29 17:46
arr = chs[temp和下面的
//将存储好的数据遍历打印出来
                for (int x=pos;x ...


正数可以正常打印出来
回复 使用道具 举报
本帖最后由 吕婷 于 2012-2-29 18:18 编辑

还是有点晕,问题是正数可以打印的,负数就不行。指针最后打印时候的取值和该数是正是负有什么具体的关系呢?
回复 使用道具 举报
你这样写--pos,还是不能打印负数么
回复 使用道具 举报
吕婷 初级黑马 2012-2-29 20:47:27
8#
李晓俊 发表于 2012-2-29 18:50
你这样写--pos,还是不能打印负数么

刚才吃饭去了,嗯,你说的对,是错误的。我这个不仅负数不行,正数大到一定程度也会出错。谢了哈

评分

参与人数 1黑马币 +2 收起 理由
老罗 + 2 赞一个!

查看全部评分

回复 使用道具 举报
王杰 黑马帝 2012-3-1 20:55:06
9#
这个问题我遇到过。如果按照你的代码正数可以编译成功但是负数就越界。错就错在打印的地方!
如果按照你的代码对6进行转换dos的结果是:


你注意没有,前面有一个空格!
你多访问了一位!
正确代码如下:
  1. class Test
  2. {
  3.         public static void main(String[] s)
  4.         {
  5.                 toBin(-6);
  6.         }
  7.         public static void toBin(int num)
  8.                 {
  9.                 char[] chs={'0','1'};
  10.                 char[] arr=new char[32];
  11.                 int pos=arr.length-1;
  12.                 while(num!=0)
  13.                         {
  14.                         int temp = num & 1;
  15.                         arr[pos--] = chs[temp];
  16.                         /*如果你输入的是一个负数,负数是正数取反加一,那么最高位一定是1,
  17.                         你上面用的指针是先运算再减一,当访问到最后一位时:arr[0]=chs[temp];
  18.                         但是程序还没有结束。里面的pos在运算以后又减一了,最后pos就变成了-1;
  19.                         */
  20.                         num = num>>>1;
  21.                         }
  22.                         for (int x=pos+1;x<arr.length ;x++ )
  23.                                 /*
  24.                                 你原来是for(int x=pos;x<arr.length;x++)
  25.                                 照你的代码执行到这里的时候pos就是-1;你说是不是访问越界了呀;
  26.                                 输入过大的正数也是一样的道理!
  27.                         */
  28.                                 System.out.print(arr[x]);

  29.                 }
  30. }
复制代码

评分

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

查看全部评分

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