原题来自牛客网的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机再研究。