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机再研究。

时间: 2024-10-09 23:30:45

java--由一道选择题研究数值越界的相关文章

对java:comp/env的研究(转)

对java:comp/env的研究 http://f543711700.iteye.com/blog/1173618 这两天研究了一下 context.lookup("java:comp/env/XXX")和直接context.lookup("XXX")的区别 网上关于这两个的文章也很多,但是都说得很难理解,比如什么ENC环境啊什么的,各种概念. 其实说得简单点:context.lookup("java:comp/env/XXX")只能用在J2E

iOS 数值越界bug

这个bug怎么发现的呢? 由于是个人开发,一直以来没有打测试包,直接跑真机或者模拟器,没有出现过这个bug,直到...老板说要安卓的小伙伴给他打个测试包,我想着,我也打个测试包试下,于是,bug 就出来了... 我先选的debug + development 模式打的包,能安装,注册登录都可以,就是内页有几个页面,本来有数据的,却没数据. 我想着是不是打包的方式不对啊,又打了个 release + adHoc的包,咦,也一样呢. 细看代码,代码里的接口啥的没有区分debug和release模式,

Java 5 泛型深入研究

Java 5泛型深入研究 上接<Java 泛型的理解与等价实现>,这个仅仅是泛型的入门.有博友反映泛型很复杂,难以掌握.鉴于此,写一片续集. 实际上泛型可以用得很复杂,复杂到编写代码的人员自己也难以看懂.这往往是对泛型的滥用或者类或接口本身设计不合理导致的. 看来用好泛型还真不容易,为此必须从根源说起. 一.逐渐深入泛型 1.没有任何重构的原始代码: 有两个类如下,要构造两个类的对象,并打印出各自的成员x. public class StringFoo { private String x;

Thinking in Java:容器深入研究

1.虚线框表示Abstract类,图中大量的类的名字都是以Abstract开头的,它们仅仅是部分实现了特定接口的工具,因此创建时能够选择从Abstract继承. Collections中的实用方法:挑几个经常使用的: 1. reverse(List):逆转次序 2. rotate(List,int distance)全部元素向后移动distance个位置,将末尾元素循环到前面来(用了三次reverse) 3.sort(List,Comparator) 排序,可依照自己的Comparator 4.

Java基础语法&lt;五&gt; 大数值BigInteger BigDecimal

如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有平有用的类:BigInteger和BigDecimal.这两个类可以处理包含任意长度数字序列的数值. BigInteger类实现了任意精度的整数运算 BigDecimal实现了任意精度的浮点数运算 使用静态的valueOf方法可以将普通的数值转换为大数值: BigInteger a = BigInteger.valueOf(100); 遗憾的是,不能使用人们熟悉的算术运算符(+ *)处理大数值. 而需要使用大数

Java反射机制深入研究

ava 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制. Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一个类的对象. 在运行时判断任意一个类所具有的成员变量和方法. 在运行时调用任意一个对象的方

Java异常的深入研究与分析

对于本文的内容,属于基础知识研究范畴,切勿以为读完此文就能将异常知识掌握到家.切记:操千曲而后晓声,观千剑而后识器,所以我觉得没有大量的源码阅读经验,你很难知道什么时候需要自定义异常,什么时候需要抛出异常. 异常机制概述 异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 异常处理的流程 当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,java虚拟机检测寻找和try关键字匹配的处理

JAVA平台AOP技术研究

3.1 Java平台AOP技术概览 3.1.1 AOP技术在Java平台中的应用 AOP在实验室应用和商业应用上,Java平台始终走在前面.从最初也是目前最成熟的AOP工具——AspectJ,到目前已经融和在企业级容器JBoss中的JBoss AOP,均建立在Java平台上. 前面已经描述到,AOP的目的就是将核心关注点和横切关注点分离,实际上这就是一种分散关注(seperation of concerns)的思路.在Java平台下,如果要开发企业级的应用,非J2EE莫属.一个J2EE应用系统只

java 8 lambdas深度研究

博客地址 http://colobu.com Java 8发布有一段日子, 大家关注Java 8中的lambda可能更早, 对Java 8中这一最重要的语言变化也基本熟悉了.这篇文章将深入研究Java 8中的lambda特性以及Stream接口等, 讨论一些深层次的技术细节. 比如, 一个lambda表达式序列化反序列化后, 对捕获的上下文变量的引用的情况. Lambda表达式递归. 类方法的引用和实例方法的引用的区别. 菱形继承的问题. Stream接口的Lazy和eager模式. Lambd