程序员人生 网站导航

Java基础――隐式转换vs强制转换

栏目:综合技术时间:2015-01-30 08:40:09

在定义变量时,有许多要注意的问题,1不谨慎就会出现损失精度或不兼容类型等问题。

例如:

    1.定义长整型数据时,必须加后缀lL

              long l =123456789012345L

    2.定义单精度类型时(7⑻位有效数字),必须加后缀 f F

              float f = 12.5F

          3. boolean类型不可以转换为其它的数据类型。

这其中,我们常常会遇到数据类型的转换问题,最为常见的要属隐式转换和强迫转换了,我们来分析1下。

隐式转换

特点:

从小到大,可以隐式转换,数据类型将自动提升。

byteshortchar -->int  -->long -->float -->double

注意:long8个字节,float4个字节。

long是整数,float是浮点型,整数和浮点数的存储规则不1样,记住1点long的范围是小于float的。

:

byte a=10;

int b=a;

当编译intb=a 时,  a隐式转换为int类型。

强迫转换

特点:

     从大到小(如果你明确知道数据是可以用该数据类型来表示的,可以用强迫转换)

格式:(转换后的数据类型)变量或值。

注:1般情况下,根本不推荐使用强迫类型转换。

            例1 :

int a=10;

byte b=(byte)a;

当编译 byte b=(byte)a 时, a被强迫转换为byte类型。

例2:

class QiangZhiDemo { public static void main(String[] args) { byte b=(byte)130; System.out.println(b); //打印结果⑴26 } }


解析:

数据130默许的是int类型的10进制数据,

第1步:10进制130转换成2进制数据。

  10000010

第2步:130在内存中的表示情势以下

原码:0000000000000000 00000000 10000010

第3步:求int130的补码

由于130是正数,所以,反码和补码都和原码1致。

补码:0000000000000000 00000000 10000010

第4步:对补码进行截取,只剩下最后8位。

(byte)130  的补码为:10000010

第5步:把该补码转化为原码。

由于符号位(第1位)是1,故该数为负数,

反码:10000001     (补码⑴)

原码:11111110     (符号位不变,数据位取反)

转化为10进制为 ⑴26 ,所以终究打印⑴26

     3 :

shorts = 1;

s= s +1;                

shorts = 1;

s+=1;                        

有问题吗?为何呢?

     解析

第1程序会报错:毛病:不兼容的类型:从int转换到short可能会有损失

          

缘由:s=s+1;s+1会隐式转换为int类型,当把1个int类型赋值给short类型是,可能会损失。

第2个程序可以编译运行。

         

缘由:s+=1,虽然可以看作s=s+1,但是还是有区分的,s+=1中有1个强迫转换,s=(short)(s+1), 会把s+1的值强迫转换为short类型,故不会报错。

小结:

数据类型转换的问题如果产生在 1些小程序上,我们 也许能够1眼看出,可是当编写1个庞大的系统时,具有庞大数据量时,这些小小的问题可能致使系统出错乃至崩溃,所之前期代码编写的严谨性就得靠我们自己掌控了。




------分隔线----------------------------
------分隔线----------------------------

最新技术推荐