首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

偶然发现java一个奇怪的现象,该如何处理

2012-01-03 
偶然发现java一个奇怪的现象程序一:这个再简单不过了。关键看程序二publicclasstemp1{publicstaticvoidmain

偶然发现java一个奇怪的现象
程序一:这个再简单不过了。关键看程序二
public   class   temp1{
        public   static   void   main(String   []   args){
                int   a   =   1   ;                
                System.out.println( "a   =   "+a);
               
                while(a <200){
                        a   =   a   *   2;
                        System.out.println( "a   =   "+a);
                }
               
        }
}

输出结果:
a   =   1
a   =   2
a   =   4
a   =   8
a   =   16
a   =   32
a   =   64
a   =   128
a   =   256


程序二:在程序一的基础上稍作改进while不停地循环
public   class   temp2{
        public   static   void   main(String   []   args){
                int   a   =   1   ;                
                System.out.println( "a   =   "+a);
               
                while(true){
                        a   =   a   *   2;
                        System.out.println( "a   =   "+a);
                }
               
        }
}

输出的结果:一直是a   =   0
a   =   0
a   =   0
a   =   0
a   =   0
a   =   0
a   =   0
....

不是我所预期的,请高手解释一下为什么不是
a   =   1
a   =   2
a   =   3
....


[解决办法]
笨,很快输出了一大堆,由于输入太多,前面的就没了,
然后就全是0了,因为乘以2相当于左移啊
无聊为什么写这种死循环
[解决办法]
这个问题的原因是因为这是个死循环,而且输出太快,你看不到,实际上输出结果是:
a = 1
a = 2
a = 4
a = 8
a = 16
a = 32
a = 64
a = 128
a = 256
a = 512
a = 1024
a = 2048
a = 4096
a = 8192
a = 16384
a = 32768
a = 65536
a = 131072
a = 262144
a = 524288
a = 1048576
a = 2097152
a = 4194304
a = 8388608
a = 16777216
a = 33554432
a = 67108864
a = 134217728
a = 268435456
a = 536870912
a = 1073741824
a = -2147483648
a = 0
a = 0
a = 0
……

你可以在输出语句前加上以下语句:
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
[解决办法]


因为有溢出现象,当a = 1073741824时,再a = a * 2使得a 溢出成a = -2147483648
再 a = a * 2时,变成了a = 0

其实就是移位问题,原来是 a = 1,每次 a = a * 2时使得 1左移一位
即 a = 10
a = 100
a = 1000
a = 10000
...

这样当1超出了int的范围时就变成了0了,而且一真是0

热点排行