A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 河北-宝哥 中级黑马   /  2015-1-29 22:02  /  974 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

例如:

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

              long l =123456789012345L

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

              float f = 12.5F

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

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


隐式转换

特征:

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

byte,short,char -->int  -->long -->float -->double

注意:long是8个字节,float是4个字节。

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

例 :

byte a=10;

int b=a;

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

强制转换

特征:

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

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

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

            例1 :

int a=10;

byte b=(byte)a;

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

例2:


[java] view plaincopy


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



解析:

数据130默认的是int类型的十进制数据,

第一步:十进制130转换成二进制数据。

  10000010

第二步:130在内存中的表示形式如下

原码:0000000000000000 00000000 10000010

第三步:求int130的补码

因为130是正数,所以,反码和补码都和原码一致。

补码:0000000000000000 00000000 10000010

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

(byte)130  的补码为:10000010

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

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

反码:10000001     (补码-1)

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

转化为十进制为 -126 ,所以最终打印-126。

     3 :

shorts = 1;

s= s +1;               

shorts = 1;

s+=1;                        

有问题吗?为什么呢?


     解析:

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

         

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

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

         

原因:s+=1,虽然可以看做s=s+1,但是还是有区别的,s+=1中有一个强制转换,即s=(short)(s+1), 会把s+1的值强制转换为short类型,故不会报错。

小结:

数据类型转换的问题如果发生在 一些小程序上,我们 或许能够一眼看出,可是当编写一个庞大的系统时,拥有庞大数据量时,这些小小的问题可能导致系统出错甚至崩溃,所以前期代码编写的严谨性就得靠我们自己把握了。


评分

参与人数 1黑马币 +20 收起 理由
金福林 + 20 研究的很细致,我很看好你

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马