详解解密Java中的类型转换问题

 更新时间:2019年03月21日 16:02:33   作者:bddylww  
这篇文章主要介绍了Java中的类型转换问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

众所周知Java中的数据类型是强数据类型,基本数据类型之间的转换尤其固定的规则,当数据宽度比较窄的数据类型(如int)转换成数据类型比较宽的数据类型时(如double),则窄的数据类型会加宽,可以完成自动类型转换,这称为隐式转换。

如:以下代码没有任何问题,结果也是正确的,成绩不会发生变化,所不同的是成绩的精度提高了。

intintScore = 96;
doubledoubleScore = intScore;

那么如果试图把宽的数据类型(如double)转换成窄的数据类型(如float)时,编译器会提示编译错误,想要编译通过,需要进行强制类型转换。那么,此时的数据会发生截断。产生的结果是:

1. 数据正确,只是精度降低了;

2. 数据不正确,发生了溢出;

对于上述第1种情况,比较好理解,我们来看个例子:

float floatWeight= 63.5; //编译错误
double doubleWeight= 63.5;

上述第一条语句会提示编译错误,那是因为编译器看到63.5时,会把它当做一个double类型,把一个double类型赋给float类型,当然编译不通过了。推荐的解决方案是:

float floatWeight = 63.5f;

当然,你也可以强制转换成float类型:

float floatWeight = (float)63.5;

其实,上述语句本质是把double类型的数据强制转换成float类型,发生了截断。虽然数据的大小没有变化,但是数据的精度却降低了。

同理:

doubleWeight = floatWeight; //隐式转换
floatWeight = (float)doubleWeight;//强制转换

现在,问题来了,既然是截断,怎么会产生溢出呢?我们先来看个例子:

shorti = 150;
shortj = 75;
byteb = (byte) i; 
byted = (byte) j; 
System.out.println("b = " + b);
System.out.println("d = " + d);

以上代码的输出结果是:

b = -106
d = 75

看到结果,不免会问为什么b=-106呢?这是因为强制转换时发生溢出。由于150超出了byte能够表示的最大范围(-128 ~ 127)。

那么-106又是如何得来的呢?

i = 150,用二进制表示i = 0000 0000 1001 0110,short类型占2个字节,16位,最高位的0表示正数。当把i强制转换成byte类型时,高位发生截断,i = 1001 0110。在计算机中,用补码表示,最高位的1表示负数,那么用原码表示的话:i = 1110 1010,正好表示十进制数-106。

至此,也就解释了为什么截断也可能会发生溢出。

以上所述是小编给大家介绍的Java中的类型转换问题详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • JAVA 添加、修改和删除PDF书签的示例代码

    JAVA 添加、修改和删除PDF书签的示例代码

    这篇文章主要介绍了JAVA 添加、修改和删除PDF书签的示例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • Java设计模式开发中使用观察者模式的实例教程

    Java设计模式开发中使用观察者模式的实例教程

    这篇文章主要介绍了Java设计模式开发中使用观察者模式的实例教程,松耦合和逻辑清晰的消息监听是观察者模式的大特色,需要的朋友可以参考下
    2016-04-04
  • 一步步教你搭建Scala开发环境(非常详细!)

    一步步教你搭建Scala开发环境(非常详细!)

    Scala是一门基于jvm的函数式的面向对象编程语言,拥有比java更加简洁的语法,下面这篇文章主要给大家介绍了关于搭建Scala开发环境的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • java中最大的整数用法分析

    java中最大的整数用法分析

    这篇文章主要介绍了java中最大的整数用法,结合具体实例形式分析了java计算类java.math.BigInteger具体使用技巧,需要的朋友可以参考下
    2017-06-06
  • 浅析Java中的异常处理机制

    浅析Java中的异常处理机制

    这篇文章主要介绍了Java中的异常处理机制的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-11-11
  • Java设计模式之单例模式示例详解

    Java设计模式之单例模式示例详解

    单例模式是最简单也是最基础的设计模式之一,单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。本文将通过一些示例代码为大家详细介绍一下单例模式,感兴趣的可以了解一下
    2021-12-12
  • java对象中什么时候适合用static修饰符踩坑解决记录

    java对象中什么时候适合用static修饰符踩坑解决记录

    这篇文章主要为大家介绍了java对象中什么时候适合用static修饰符踩坑解决记录,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 分析ABA问题的本质及其解决办法

    分析ABA问题的本质及其解决办法

    CAS的全称是compare and swap,它是java同步类的基础,java.util.concurrent中的同步类基本上都是使用CAS来实现其原子性的。本文将介绍ABA问题的本质及其解决办法。
    2021-06-06
  • 关于java中基本数据类型的数值范围

    关于java中基本数据类型的数值范围

    这篇文章主要介绍了关于java中基本数据类型的数值范围,基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型,它们是我们编程中使用最频繁的类型,需要的朋友可以参考下
    2023-07-07
  • Spring @Transactional工作原理详解

    Spring @Transactional工作原理详解

    这篇文章主要介绍了Spring @Transactional工作原理详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论