时间:2021-05-19
众所周知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中的类型转换问题详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
详解Java中日期数据类型的处理之格式转换的实例概要:日期以及时间格式处理,在Java中时间格式一般会涉及到的数据类型包括Calendar类和Date类。Dat
由于JavaScript属于弱类型脚本语言,因此当其与强类型的后台语言进行数据交互时会产生各种问题,特别是加解密的操作。本人由于工作中遇到用js与Java进行相
PHP中类型转换,常量,系统常量,魔术常量的详解1.自动类型转换;在运算和判断时,会进行自动类型转换;1)其他类型转为bool,判断时转换;1)整型转布尔型:0
Java中,经常可以遇到类型转换的场景,从变量的定义到复制、数值变量的计算到方法的参数传递、基类与派生类间的造型等,随处可见类型转换的身影。Java中的类型转换
Java多态对象的类型转换这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时,java运行时将抛出j