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

以下是代码。

 public class Test2 {
public static void add(Byte b)
{
b=b++;
}
public static void main(String[] args)
{
Byte a =127;
Byte b =127;
add(++a);
System.out.print(a+" ");
add(b);
System.out.print(b+" ");
}
}

输出结果:-128,127.

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

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

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

 public class test {
public static void main(String[] args)
{ Byte a =127;
System.out.println(Integer.toBinaryString(a));
System.out.println(a);
a++;
System.out.println(Integer.toBinaryString(a));
System.out.println(a); }
}

输出结果:

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

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

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

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

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

 public class test {
public static void main(String[] args)
{ Byte a =(byte)128;
System.out.println(a);
a=(byte) 129;
System.out.println(a); }
}

输出,-128,-127。

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

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

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

  1. 【JAVA零基础入门系列】Day9 Java中的那个大数值

    什么是大数值?用脚趾头想也知道,当然是"大"的数值(233).Java中有两个用于表示大数值的类,BigInteger和BigDecimal,那到底能表示多大的数值呢?理论上,可以 ...

  2. java io 源码研究记录(一)

    Java IO 源码研究: 一.输入流 1  基类 InputStream 简介: 这是Java中所有输入流的基类,它是一个抽象类,下面我们简单来了解一下它的基本方法和抽象方法. 基本方法: publ ...

  3. 携程Java工程师——一道面向对象面试选择题(转)

    public class Base { private String baseName = "base"; public Base() { callName(); } public ...

  4. Java反射机制深入研究

    ava 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”.   在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? ...

  5. Java异常的深入研究与分析

    前言 本文是异常内容的集大成者,力求全面,深入的异常知识研究与分析.本文由金丝燕网独家撰写,参考众多网上资源,经过内容辨别取舍,文字格式校验等步骤编辑而成,以飨读者.对于本文的内容,建议小白需要多多思 ...

  6. JNDI:对java:comp/env的研究

    这两天研究了一下 context.lookup("java:comp/env/XXX")和直接context.lookup("XXX")的区别 网上关于这两个的 ...

  7. Java基础语法<五> 大数值BigInteger BigDecimal

    笔记整理 来源于<Java核心技术卷 I > <Java编程思想> 如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有平有用的类:BigIn ...

  8. java中不同类型的数值占用字节数

    在Java中一共有8种基本数据类型,其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型和1种用于表示真值的boolean类型.(一个字节等于8个bit) 1.整型 类型 ...

  9. 【Java集合的详细研究5】Java中Array与ArrayList的主要区别

    1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array([]):最高效:但是其容量固定且无法动态改变:     ArrayList:  容量可动态增长:但牺 ...

随机推荐

  1. Vue.js 在 webpack 脚手架中使用 cssnext

    Vue.js 的 webpack脚手架默认已经使用了 PostCSS 的 autoprefixer 的功能. 如果想使用下一代 css语法,即cssnext: 1. 安装依赖 npm install ...

  2. VMware 克隆多台Linux机器并配置IP的方法

    我们首先要知道 VMware 三种网络模式的区别. ①.Bridged(桥接模式):就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信.在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置 ...

  3. layui的模块化和非模块化使用

    非模块化和模块化的区别是 非模块化不用每次都调用layui.use([],fun...)引入对应模块,引入的JS是/layui/layui.all.js 模块化必须每次都调用layui.use([], ...

  4. elk系列7之通过grok分析apache日志【转】

    preface 说道分析日志,我们知道的采集方式有2种: 通过grok在logstash的filter里面过滤匹配. logstash --> redis --> python(py脚本过 ...

  5. sicily 1003. Hit or Miss

    Description One very simple type of solitaire game known as "Hit or Miss" (also known as & ...

  6. MD5做为文件名。机器唯一码有电脑的CPU信息和MAC地址,这两个信息需要在linux或unix系统下才能获取吧。

    可以采用机器(电脑)唯一码 + 上传IP + 当前时间戳 + GUID ( + 随机数),然后MD5做为文件名.机器唯一码有电脑的CPU信息和MAC地址,这两个信息需要在linux或unix系统下才能 ...

  7. java版云笔记(五)

    下来是创建笔记本,创建笔记,这个没什么难点和前面是一样的. 创建笔记本 首先点击"+"弹出添加笔记的对话框,然后点击确定按钮创建笔记本. //点击"+"弹出添加 ...

  8. hdu 5918(强行水过去..正解KMP)

    Sequence I Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  9. google的面试题(三维动态规划的范例)——(87)Scramble String

    转:http://www.cnblogs.com/easonliu/p/3696135.html 分析:这个问题是google的面试题.由于一个字符串有很多种二叉表示法,貌似很难判断两个字符串是否可以 ...

  10. SGU 206. Roads

    206. Roads time limit per test: 0.5 sec. memory limit per test: 65536 KB input: standard output: sta ...