zoukankan      html  css  js  c++  java
  • 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练习笔记---copyfile
    String
    十进制转化为八进制--栈实现
    一、给计算机专业的同学,计算机鸡汤
    数值的整数次方
    剪绳子-动态规划-贪婪
    二进制中为1 的数字个数
    机器人运动范围——回溯法应用
    矩阵的路径
  • 原文地址:https://www.cnblogs.com/wkmocr/p/7603780.html
Copyright © 2011-2022 走看看