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

Posted ggrc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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机再研究。

以上是关于java--由一道选择题研究数值越界的主要内容,如果未能解决你的问题,请参考以下文章

JAVA数值越界在内存中是怎么处理的?比如:byte b = 129 ,怎么转?

一道经典面试题讲解 :数组越界而没报错 ,却出现死循环 ?(C语言)

Java中的数组越界问题

iOS 数值越界bug

每天一道面试题:深入理解Java虚拟机系列

一道经典面试题:字符串在Java中如何通过“引用”传递