解密Java中的类型转换问题 曾经终败给现在 2023-10-17 15:27 64阅读 0赞 众所周知Java中的数据类型是强数据类型,基本数据类型之间的转换尤其固定的规则,当数据宽度比较窄的数据类型(如int)转换成数据类型比较宽的数据类型时(如double),则窄的数据类型会加宽,可以完成自动类型转换,这称为隐式转换。 如:以下代码没有任何问题,结果也是正确的,成绩不会发生变化,所不同的是成绩的精度提高了。 <table> <tbody> <tr> <td> <div> 1 </div> <div> 2 </div> </td> <td> <div> <div> <code>intintScore = </code> <code>96</code> <code>;</code> </div> <div> <code>doubledoubleScore = intScore;</code> </div> </div> </td> </tr> </tbody> </table> 那么如果试图把宽的数据类型(如double)转换成窄的数据类型(如float)时,编译器会提示编译错误,想要编译通过,需要进行强制类型转换。那么,此时的数据会发生截断。产生的结果是: 1. 数据正确,只是精度降低了; 2. 数据不正确,发生了溢出; 对于上述第1种情况,比较好理解,我们来看个例子: <table> <tbody> <tr> <td> <div> 1 </div> <div> 2 </div> </td> <td> <div> <div> <code>float</code> <code>floatWeight= </code> <code>63.5</code> <code>; </code> <code>//编译错误</code> </div> <div> <code>double</code> <code>doubleWeight= </code> <code>63.5</code> <code>;</code> </div> </div> </td> </tr> </tbody> </table> 上述第一条语句会提示编译错误,那是因为编译器看到63.5时,会把它当做一个double类型,把一个double类型赋给float类型,当然编译不通过了。推荐的解决方案是: <table> <tbody> <tr> <td> <div> 1 </div> </td> <td> <div> <div> <code>float</code> <code>floatWeight = </code> <code>63</code> <code>.5f;</code> </div> </div> </td> </tr> </tbody> </table> 当然,你也可以强制转换成float类型: <table> <tbody> <tr> <td> <div> 1 </div> </td> <td> <div> <div> <code>float</code> <code>floatWeight = (</code> <code>float</code> <code>)</code> <code>63.5</code> <code>;</code> </div> </div> </td> </tr> </tbody> </table> 其实,上述语句本质是把double类型的数据强制转换成float类型,发生了截断。虽然数据的大小没有变化,但是数据的精度却降低了。 同理: <table> <tbody> <tr> <td> <div> 1 </div> <div> 2 </div> </td> <td> <div> <div> <code>doubleWeight = floatWeight; </code> <code>//隐式转换</code> </div> <div> <code>floatWeight = (</code> <code>float</code> <code>)doubleWeight;</code> <code>//强制转换</code> </div> </div> </td> </tr> </tbody> </table> 现在,问题来了,既然是截断,怎么会产生溢出呢?我们先来看个例子: <table> <tbody> <tr> <td> <div> 1 </div> <div> 2 </div> <div> 3 </div> <div> 4 </div> <div> 5 </div> <div> 6 </div> </td> <td> <div> <div> <code>shorti = </code> <code>150</code> <code>;</code> </div> <div> <code>shortj = </code> <code>75</code> <code>;</code> </div> <div> <code>byteb = (</code> <code>byte</code> <code>) i; </code> </div> <div> <code>byted = (</code> <code>byte</code> <code>) j; </code> </div> <div> <code>System.out.println(</code> <code>"b = "</code> <code>+ b);</code> </div> <div> <code>System.out.println(</code> <code>"d = "</code> <code>+ d);</code> </div> </div> </td> </tr> </tbody> </table> 以上代码的输出结果是: 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。 至此,也就解释了为什么截断也可能会发生溢出。 本文出自 “[心飞翔][Link 1]” 博客,请务必保留此出处[http://weiweili.blog.51cto.com/6675651/1901017][http_weiweili.blog.51cto.com_6675651_1901017] [Link 1]: http://weiweili.blog.51cto.com [http_weiweili.blog.51cto.com_6675651_1901017]: http://weiweili.blog.51cto.com/6675651/1901017
相关 解析并解决Java中的类型转换问题 在Java中,类型转换是一个常见的编程任务。但是,如果处理不当,可能会导致各种类型的运行时错误。 以下是一些关于Java中类型转换的基本规则和常见问题: 1. **基本类型 快来打我*/ 2024年09月19日 11:30/ 0 赞/ 19 阅读
相关 解决Java中的类型转换问题:案例分析 在Java编程中,类型转换是常见的情况。当一个值需要存储在不同的数据类型时,就需要进行类型转换。 以下是一个简单的Java类型转换案例分析: 1. **基本类型到引用类型* 分手后的思念是犯贱/ 2024年09月19日 05:54/ 0 赞/ 4 阅读
相关 数据类型转换:Java中不同类型相互转换的问题案例? 在Java编程中,数据类型的转换是常见的操作。以下是一些类型转换的实例问题: 1. 基本类型之间的转换: - int -> double: "int num = 10; 约定不等于承诺〃/ 2024年09月18日 00:00/ 0 赞/ 7 阅读
相关 类型转换问题:Java自动类型转换的边界情况分析 在Java编程中,自动类型转换是一个常见的现象。但这种转换并非无边界的,Java对此有一些明确的规定和边界情况。以下是一些主要的考虑因素: 1. **基本数据类型的自动转换* 痛定思痛。/ 2024年09月17日 09:06/ 0 赞/ 8 阅读
相关 Java泛型应用中的类型转换问题 在Java泛型中,类型转换可能遇到的问题主要有以下几点: 1. 泛型约束:如果某个泛型参数有明确的类型约束(如List<String>),那么直接强制转换可能会导致编译错误。 小灰灰/ 2024年09月11日 05:21/ 0 赞/ 12 阅读
相关 java中的类型转换(包含数据类型转换/数据类型和字符串类型的转换) 目录 数据类型转换 自动类型转换(隐式转换) 强制类型转换(显式转换) 类型提升 数据类型和字符串类型的转换 -------------------- 数 水深无声/ 2024年03月27日 08:55/ 0 赞/ 62 阅读
相关 解密Java中的类型转换问题 众所周知Java中的数据类型是强数据类型,基本数据类型之间的转换尤其固定的规则,当数据宽度比较窄的数据类型(如int)转换成数据类型比较宽的数据类型时(如double),则窄的 曾经终败给现在/ 2023年10月17日 15:27/ 0 赞/ 65 阅读
相关 java中的类型转换 java的基本数据类型 1.数值型:byte,short,int,long,float,double 2.字符型:char 3.布尔型:boolean <tab r囧r小猫/ 2023年09月24日 20:40/ 0 赞/ 22 阅读
相关 关于java类型转换的问题 数据类型的转换,分为自动转换和强制转换。自动转换是程序在执行过程中 “ 悄然 ” 进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代 àì夳堔傛蜴生んèń/ 2022年07月13日 04:21/ 0 赞/ 122 阅读
还没有评论,来说两句吧...