详解解密Java中的类型转换问题
作者:bddylww 发布时间:2023-11-24 20:46:28
众所周知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中的类型转换问题详解整合,希望对大家有所帮助。
来源:https://blog.51cto.com/weiweili/1901017


猜你喜欢
- 目录前言一、小提二、将传感器改成事件分发机制三、使用四、源码总结前言在之前写了一篇关于3D效果的文章,借助传感器展示,有小伙伴问可不可以改成
- 本文提纲版本约定JDK:8Servlet:4.xtomcat:9.x✍正文什么样的答案终身难忘?学生时代关于记忆经常能听见两种论调:死记硬背
- 开发中有时候需要自己封装分页排序时,List如何对某一属性排序呢,分享一个小实例,大家共勉,希望能对大家有用,请多多指教。1.Student
- 一、题目描述题目实现:一个服务器与多个客户端通信。通过一个服务器与多个客户端进行通信,运行程序,服务器启动后,启动两个客户端程序,然后通过服
- 协程源码的结构在研究Kotlin源码之前,得先搞懂Kotlin源码结构分布。不然找不到该看哪里的代码。看源码之前当然先得有一个目标,最好是带
- 本文实例为大家分享了Android Socket实现多个客户端聊天布局的具体代码,供大家参考,具体内容如下服务器Socket接受到客户端发送
- 本文实例讲述了基于C#实现XML文件读取工具类。分享给大家供大家参考。具体如下:这是我去年写的一个XML文件读取工具类,现在做了一些调整 基
- 本文实例讲述了C#双向链表LinkedList排序实现方法。分享给大家供大家参考。具体如下:1.函数打印链表函数PrintLinkedLis
- 介绍技术之前有用eureka 现在用nacos工作流和gateway接口数据流向数据表新建项目新建cloud-删除src-新建modleEu
- JSR303简介JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernat
- 1.概述1、Spring 是轻量级的开源的 JavaEE 框架2、 Spring 可以解决企业应用开发的复杂性3、Spring 有两个核心部
- 前言这是几个月前写的博文,睡前看了觉得有些敷衍,还是改了再发吧。之前的博客做了个锁屏应用,在以前各种酷炫的锁屏效果是很流行的,有时候会去锁屏
- 本文实例讲述了C#中lock的用法。分享给大家供大家参考。具体分析如下:lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这
- 本文实例为大家分享了Android文本视图TextView实现聊天室的具体代码,供大家参考,具体内容如下Math.random()生成随机数
- 本文实例为大家分享了Android实现拼图游戏的具体代码,供大家参考,具体内容如下本人是用 android studio 完成的源码pack
- 前言终于算是忙完了一个阶段!!!从4月份开始,工作内容以及职务上都进行了较大的变动,最直接的就是从海外项目组调到了国内项目组。国内项目组目前
- 1、字符串数字之间的转换(1)string --> char * string str("OK");
- 前言同C语言一样,Java也有断言关键字assert,它们的用法也比较相似。注意:Java的断言是从1.4版本开始的,以前的版本不支持断言。
- 0.关于AOP面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是软件开发中的一个热点,也
- 比如在类上使用该注解 @Alias("dDebtEntity")则在mapper.xml文件中resultType=&q