java语言基础-类型运算细节
代码一:
public class varDemo
{
public static void main(String[] args)
{
byte a2;
a2=3+4;
System.out.println(a2);
}
}
运行结果:

到目前为止没问题,OK,我现在把代码改一下
代码二:
public class varDemo
{
public static void main(String[] args)
{
byte a=3;
byte a1=4;
byte a2;
a2=a+a1;
System.out.println(a2);
}
}
(编译前想着这应该和上面的运行结果一样,因为a2是byte型,a和a1也是byte型,编译和运行应该完全OK.....)
结果.......
运行结果:

WTF???
怎么报错了?再回去看代码,还是不知道哪里出了问题......
OK,言归正传,我们来分析一下哪里出了问题:
首先我们观察第一段代码和第二段代码的不同之处


通过比较,我们发现,a2都是byte型变量,而不同之处在a2右边的东东。第一段代码右边是两个常量:3和4,而第二段代码右边是两个变量:a和a1(尽管它们已经被赋了值,但它仍然有可能被改变,因此他们的值是不确定的,所以编译器无法判断a和a1的取值,(a和a1的值有可能会超出byte类型的最大或最小范围,)因此,编译器报错:有可能造成精度流失)。
所以我们可以得出一个结论:如果赋值号(=)右边是变量,编译器无法判断变量的取值,因此不能赋值给左边,所以编译器报错。
接下来我们看这段代码:
代码三:
public class varDemo
{
public static void main(String[] args)
{
byte a=3;
byte a1=4;
//byte a2;
int a2;
a2=a+a1;
System.out.println(a2);
}
}
这段代码和第二段代码的区别在于,a2由byte型变为int型,赋值号右边的a和a1仍然是byte型的变量。让我们看一看它能不能通过编译并成功运行呢
编译和运行结果:

没问题,成功通过编译和运行。
为什么赋值号右边同样是byte型变量,代码二报错而代码三成功通过编译和运行呢?
原因分析:
代码二的赋值号左边的a2也同右边一样是byte型,因此右边的两个byte型变量相加很有可能超出byte型的范围,会造成精度流失。
而代码三的赋值号左边的a2是int型,无论右边的两个byte型变量取什么值都不会超出a2的范围,因此成功通过编译。
马不停蹄......
再来看看下面一段代码:
代码四:
public class varDemo
{
public static void main(String[] args)
{
int x;
int x1=80;
int x2=98;
x=x1+x2;
System.out.println(x);
}
}
在这段代码中,x,x1,x2均为int型变量。(类似于代码二中a,a1,a2均为byte型变量)
但......
运行结果:

成功通过编译并运行!
原因:在计算机中,对整数的运算,运算的最终结果都仍然是整数(默认int型),用默认的int类型接收整数类型完全可以。因此可以通过编译。
但,有人要问了,就像代码二一样,如果右边的两个int型变量相加超过了int型的范围怎么办。OK,让我们来看一看这种情况:
代码五:
public class varDemo
{
public static void main(String[] args)
{
int x;
int x1=Integer.MAX_VALUE; //求int型变量的最大值
int x2=98;
x=x1+x2;
System.out.println(x);
}
}
运行结果:

果不其然,真的超出了int型的最大范围,至于为什么会是负数,是因为,右边两个变量的值相加已经超出了int型的范围了(-2^32 ~ 2^32-1),超出了32位,再向前进位,但赋值号左边的x是int型,最多只能取到32位,因此,系统自动地强行把高位数(大于32位)抛弃掉,因此第32位的数一定是1,而只有负数的最高位数才是1,所以,最终显示的是一个负数。
注:本人初学Java,若分析有什么错误的话,还望大家能够体谅并指出!谢谢!
java语言基础-类型运算细节的更多相关文章
- Java学习总结(二)----Java语言基础
1. Java语言基础 2.1 关键字 定义:被java语言赋予特殊含义的单词 特点:关键字中的字母都为小写 用于定义数据类型的关键字 class,interface,byte,short,i ...
- java语言基础02
一.Java语言基础(常量的概述和使用)(掌握) 1:什么是常量 就是在程序的执行过程中其值不发生改变的量. 2:Java中常量的分类 (1):字面值常量 (2):自定义常量(面向对象部分讲解) 3: ...
- Java之--Java语言基础组成—数组
Java语言基础组成-数组 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的数组,数组 ...
- Java之--Java语言基础组成—函数
Java语言基础组成-函数 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的函数,函数 ...
- Java之--Java语言基础组成(关键字、标识符、注释、常量和变量、运算符)
Java语言基础组成-关键字.标识符.注释.常量和变量.运算符 Java语言由8个模块构成,分别为:1.关键字:2.标识符(包名.类名.接口名.常量名.变量名等):3.注释:4.常量和变量:5.运算符 ...
- Java语言基础(八)
Java语言基础(八) 一.数学运算 + - * / % (1)凡是byte short char类型都按int类型的计算 看看上面的代码,为什么出错! 我已经将100转成byte类型,( ...
- Java语言基础(六)
Java语言基础(六) 前一章提到的, BigDecimal, DecimalFormat等具体用法,这里就不在说了,网上有许多 一.下面让我们看一个例子(自由落体运动位移) 说明: (1).公式是 ...
- Java入门篇(二)——Java语言基础(下)
上篇说到Java中的变量与常量,接下来就是简单的计算了,首先需要了解一下Java中的运算符. 六.运算符 1. 赋值运算符 赋值运算符即"=",是一个二元运算符(即对两个操作数进行 ...
- 第二十六节:复习Java语言基础-Java的概述,匿名对象,封装,构造函数
Java基础 Java语言概述 Java语言 语言 描述 javaee 企业版 javase 标准版 javame 小型版 JDK JDK(Java开发工具包) Java语言 语言 Java语言 Ja ...
随机推荐
- springboot web项目搭建
1.选择spring initializr 2.填写应用名称及设置相关配置,建议使用默认配置即可 3.选择相关技术,我们现在web技术 4.填写项目名称 5.项目文件结构如下 6.直接运行 java ...
- 理解Objective-C Runtime (六)super
super 在Objective-C中,如果我们需要在类的方法中调用父类的方法时,通常都会用到super,如下所示: @interface MyViewController: UIViewContro ...
- Synchronized之四:Synchronized的可重入性
本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock. 可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响.在JAVA ...
- window.scrollTo和window.scrollBy
scrollTo-- 在窗体中如果有滚动条,将横向滚动条移动到相对于窗体宽度为x个像素的位置,将纵向滚动条移动到相对于窗体高度为y个像素的位置(如果没有滚动条,页面不会发生任何变化) scrollTo ...
- IOS:程序的退出、App间的跳转
今天在做一个音乐播放器的项目,发现这个点击退出程序的功能不能实现终于找到了一些有用的资料,就去网上看了半天资料,下面是退出程序的代码: 在动画里面可以自己添加一些,动画,达到相应的效果. AppDel ...
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 24. Logging
常用的诊断中间件: UseDeveloperExceptionPage UseStatusCodePages:返回 400~600 的状态码 UseExceptionHandler 自定义异常的处理器 ...
- js实现属性只读
第一种 Object.defineProperty 这种是在vue源码中看见的 let obj = { $data: {} }; Object.defineProperty(obj, '$data', ...
- 洛谷 - P2045 - 方格取数加强版 - 费用流
原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...
- PTA 模拟【string以及字母->数组下标】
假设有九宫格输入法键盘布局如下: [ 1,.?! ] [ 2ABC ] [ 3DEF ] [ 4GHI ] [ 5JKL ] [ 6MNO ] [ 7PQRS ] [ 8TUV ] [ 9WXYZ ] ...
- java 强大的反射机制
这段时间,在对接一个开源的版本时,发现由于依赖的开源版本api老是随着版本的变化而变化,导致代码经常需要修改,异常痛苦. 终于,在一个风和日丽的下午(五月末的广州异常暴晒),楼主下定决心要修掉这个大篓 ...