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

  Java中

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

  

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

        intintScore=96;   doubledoubleScore=intScore;      

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

  

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

  

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

  

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

        浮动floatWeight=63.5;//编译错误   双doubleWeight=63.5;      

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

        浮动floatWeight f=63.5;      

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

        浮动floatWeight=(浮动)63.5;      

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

  

同理:         doubleWeight=floatWeight;//隐式转换   floatWeight=(浮动)doubleWeight;//强制转换      

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

        shorti=150;   shortj=75;   byteb=(字节)我;   字节=(字节)j;   system . out。println (" b=" + b);   system . out。println (d=" + d);      

以上代码的输出结果是:

  
  

b=-106
  d=75

     

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

  -106年

那么又是如何得来的呢?

  

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

  

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

  

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

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