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 ...
随机推荐
- java中io类型及成熟io框架
就io本身而言,概念上有5中模型:blocking I/O, nonblocking I/O, I/O multiplexing(select and poll), singal driven I/O ...
- I.MX6 Android /data 目录内容
/**************************************************************************** * I.MX6 Android /data ...
- Redmine 数据库连接错误
/******************************************************************** * Redmine 数据库连接错误 * 说明: * Open ...
- Healthy Holsteins
链接 分析:因为数据范围比较小,我们可以通过二进制枚举子集,然后找出所需饲料种数最小的并记录下来,同时记录一下路径,也就是字典序最小的 /* PROB:holstein ID:wanghan LANG ...
- NOIP2007普及 守望者的逃离
传送门 普及组的题目……很水. 原来写了一个模拟不过好像状态考虑的不全得了80,这次我们考虑一下dp做法. 守卫者有两种移动的方法,一种是闪现,一种是跑,我们可以把闪现和跑分开处理. 首先只处理闪现的 ...
- Open multiple excel files in WebBrowser, only the last one gets activated
http://stackoverflow.com/questions/20578053/open-multiple-excel-files-in-webbrowser-only-the-last-on ...
- win7下出现'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件的解决方法
在win7竟然不可能使用telnet命令,使用时会出现“'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件”,研究了很多,才终于明白WIN7默认是没有安装这个命令. 处理办法: 依次 ...
- 02_使用httpurlconnection提交参数_get
- B - Soldier and Badges
Time Limit:3000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description Colone ...
- 简析hotjar录屏功能实现原理
简析hotjar录屏功能实现原理 众所周知,hotjar中录屏功能是其重要的一个卖点,看着很牛X酷炫的样子,今天就简单的分析一下其可能实现(这里只根据其请求加上个人理解分析,并不代表hotjar中真实 ...