java--由一道选择题研究数值越界

原题来自牛客网的java专项练习:

以下是代码。

 1 public class Test2 {
 2     public static void add(Byte b)
 3     {
 4         b=b++;
 5     }
 6     public static void main(String[] args)
 7     {
 8         Byte a =127;
 9         Byte b =127;
10         add(++a);
11         System.out.print(a+" ");
12         add(b);
13         System.out.print(b+" ");
14     }
15 }

 输出结果:-128,127.

注意到Byte是byte的分装类,范围为[-128,127],add函数是值传递,对a的值没有影响,a越界后变成了-128,是不是拆包装的问题呢?

把Byte改成byte再实验,发现输出还是:-128,127.说明问题不在这。

试着输出a++前后的二进制。

 1 public class test {
 2     public static void main(String[] args)
 3     {
 4         
 5         Byte a =127;
 6         System.out.println(Integer.toBinaryString(a));
 7         System.out.println(a);
 8         a++;
 9         System.out.println(Integer.toBinaryString(a));
10         System.out.println(a);
11         
12         
13     }
14 }

 输出结果:

由于Byte里面没有封装十进制转换为二进制的方法。这里使用Integer.toBinaryString()。此方法自动清除二进制前面的0.

所以a++前后的值为。01111111,10000000.

那么继续a++呢?输出结果为10000001=-127.

同样-128-1后得到结果为0111111=127

那么声明变量或者给变量赋值的时候越界呢?

 1 public class test {
 2     public static void main(String[] args)
 3     {
 4         
 5         Byte a =(byte)128;
 6         System.out.println(a);
 7         a=(byte) 129;
 8         System.out.println(a);
 9         
10     }
11 }

 输出,-128,-127。

说明java并不对数值是否越界进行检查,而调用的时候只调用声明变量大小的内存所存的值。

那么jvm是怎么避免变量数值越界改变其他变量的值的呢?好奇。先放在这里以后学习到jvm机再研究。

posted on 2017-09-27 21:48  ggrc  阅读(540)  评论(0编辑  收藏  举报

导航