代码一:

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. codeforces 414C C. Mashmokh and Reverse Operation(归并排序求逆序对)

    题目链接: C. Mashmokh and Reverse Operation time limit per test 4 seconds memory limit per test 512 mega ...

  2. Struts2 文件上传 之 文件类型 allowedTypes

     转自:https://www.cnblogs.com/zxwBj/p/8546889.html '.a'      : 'application/octet-stream', '.ai'     : ...

  3. java链接sqlserver数据库

    需要用到sqljdbc.jar包 JSP代码 <%@ page language="java" import="java.sql.*" import=&q ...

  4. linux设备驱动第三篇:如何实现一个简单的字符设备驱动

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...

  5. wxPython学习笔记1

    wxpython介绍: wxPython 是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的.功能键全的  GUI 用户界面. wxPython 是作为优 ...

  6. Table View Programming Guide for iOS---(四)---Navigating a Data Hierarchy with Table Views

    Navigating a Data Hierarchy with Table Views 导航数据表视图层次 A common use of table views—and one to which ...

  7. python __builtins__ zip类 (71)

    71.'zip' , 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表.如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作 ...

  8. 洛谷 P2296 寻找道路【bfs+spfa】

    反向建边bfs出不能到t的点,然后对每个能到这些点的点打上del标记,然后spfa的时候不经过这些点即可 #include<iostream> #include<cstdio> ...

  9. LuoguP2602 [ZJOI2010]数字计数【数位dp】By cellur925

    题目传送门 题目大意:给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 继续数位dp=w=. 这一次我们不需要记录$pre$啦!(撒花). 因为这次我们需要的 ...

  10. 如何在VS2010的VC++ 基于对话框的MFC程序中添加菜单

    方法1:亲测 成功  转载自https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/48338f6b-e5d9-4c0c-8b17-05ca3ef ...