详解解密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

标签:Java,类型转换
0
投稿

猜你喜欢

  • 浅析java中next与nextLine用法对比

    2022-01-11 01:02:53
  • C++之异常处理详解

    2023-04-10 10:22:00
  • SpringBoot Actuator潜在的OOM问题的解决

    2021-08-26 06:36:43
  • 详解android进行异步更新UI的四种方式

    2023-12-24 19:46:55
  • 消息中间件详解以及比较选择

    2022-08-17 03:01:01
  • java如何用Processing生成马赛克风格的图像

    2023-11-07 20:52:44
  • Android自定义View控件实现刷新效果

    2022-05-12 14:43:22
  • SpringBoot后端进行数据校验JSR303的使用详解

    2022-02-19 01:15:31
  • IDEA:Git stash 暂存分支修改的实现代码

    2023-11-29 09:16:35
  • java使用lambda表达式对List集合进行操作技巧(JDK1.8)

    2021-05-30 06:41:06
  • Android 实现全屏显示的几种方法整理

    2022-05-09 03:21:01
  • Android嵌套滚动NestedScroll的实现了解一下

    2022-09-10 13:48:57
  • 如何使用C语言将数字、字符等数据写入、输出到文本文件中

    2023-09-07 12:09:07
  • C#中异步回调函数用法实例

    2023-01-05 13:10:53
  • 快速理解Java垃圾回收和jvm中的stw

    2021-09-06 20:27:17
  • 常用Maven库,镜像库及maven/gradle配置(小结)

    2023-11-20 23:44:00
  • Android apk 插件启动内存释放问题

    2022-05-16 07:26:39
  • 利用Spring boot+LogBack+MDC实现链路追踪

    2023-10-03 16:02:53
  • java简单实现多线程及线程池实例详解

    2023-05-12 05:47:04
  • idea maven 项目src下的配置文件没有同步至target的解决操作

    2023-01-19 19:40:19
  • asp之家 软件编程 m.aspxhome.com