代码一:

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语言基础-类型运算细节的更多相关文章

  1. Java学习总结(二)----Java语言基础

    1.     Java语言基础 2.1 关键字 定义:被java语言赋予特殊含义的单词 特点:关键字中的字母都为小写 用于定义数据类型的关键字 class,interface,byte,short,i ...

  2. java语言基础02

    一.Java语言基础(常量的概述和使用)(掌握) 1:什么是常量 就是在程序的执行过程中其值不发生改变的量. 2:Java中常量的分类 (1):字面值常量 (2):自定义常量(面向对象部分讲解) 3: ...

  3. Java之--Java语言基础组成—数组

    Java语言基础组成-数组 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的数组,数组 ...

  4. Java之--Java语言基础组成—函数

    Java语言基础组成-函数 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的函数,函数 ...

  5. Java之--Java语言基础组成(关键字、标识符、注释、常量和变量、运算符)

    Java语言基础组成-关键字.标识符.注释.常量和变量.运算符 Java语言由8个模块构成,分别为:1.关键字:2.标识符(包名.类名.接口名.常量名.变量名等):3.注释:4.常量和变量:5.运算符 ...

  6. Java语言基础(八)

    Java语言基础(八) 一.数学运算  + - * /  % (1)凡是byte  short  char类型都按int类型的计算   看看上面的代码,为什么出错! 我已经将100转成byte类型,( ...

  7. Java语言基础(六)

    Java语言基础(六) 前一章提到的, BigDecimal, DecimalFormat等具体用法,这里就不在说了,网上有许多 一.下面让我们看一个例子(自由落体运动位移) 说明: (1).公式是 ...

  8. Java入门篇(二)——Java语言基础(下)

    上篇说到Java中的变量与常量,接下来就是简单的计算了,首先需要了解一下Java中的运算符. 六.运算符 1. 赋值运算符 赋值运算符即"=",是一个二元运算符(即对两个操作数进行 ...

  9. 第二十六节:复习Java语言基础-Java的概述,匿名对象,封装,构造函数

    Java基础 Java语言概述 Java语言 语言 描述 javaee 企业版 javase 标准版 javame 小型版 JDK JDK(Java开发工具包) Java语言 语言 Java语言 Ja ...

随机推荐

  1. html5--6-28 css盒模型4

    html5--6-28 css盒模型4 实例 学习要点 了解盒模型 元素内容.内边距.边框 和 外边距 了解盒模型的概念: CSS 盒模型规定了处理元素内容.内边距.边框 和 外边距 的方式. 最内部 ...

  2. Python学习笔记_Redis

    一.Redis介绍 非关系型数据库:mongodb.redis redis数据全部是存在内存里面的. redis本身每秒支持30w次的读写,本身性能非常好, redis重启后,数据会消失,持久性不好, ...

  3. hdu 4463 Outlets(最小生成树)

    题意:n个点修路,要求总长度最小,但是有两个点p.q必须相连 思路:完全图,prim算法的效率取决于节点数,适用于稠密图.用prim求解. p.q间距离设为0即可,最后输出时加上p.q间的距离 pri ...

  4. [laravel]phpunit

    step1.install phpunit composer.json require中增加 "phpunit/phpunit":"4.0.*" 执行 comp ...

  5. HNOI2017 day1 T3 礼物

    题目大意: 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一天 ...

  6. jQuery测试结果

    您的回答: 1.下面哪种说法是正确的? 您的回答:jQuery 是 JavaScript 库 2.jQuery 使用 CSS 选择器来选取元素? 您的回答:正确 3.jQuery 的简写是? 您的回答 ...

  7. 51nod 1062【水题】

    直接打表构造啊 #include <stdio.h> #include <string.h> #include <iostream> using namespace ...

  8. .NET Core 跨平台物联网开发:设置委托事件(二)

    系列教程目录 (一) 连接阿里云IOT (二) 设置委托事件 (三) 上报属性 (四)  SDK文档 属性.方法.委托.类 http://pan.whuanle.cn/index.php?dir=up ...

  9. 最小公倍数的最小和(Minimum Sum LCM )

    #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> u ...

  10. size_t与size_type区别

    size()  标准库string里面有个函数size,用来返回字符串中的字符个数,具体用法如下: string st("The expense of spirit\n");cou ...