JAVA 系列——>数据类型转换

前言:Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。

自动类型转换

特点:无需处理,自动转换
规则:从小到大转换

public class test{ 
      public static void main(String[] args){
             System.out.println(100); //整型 默认int
             System.out.println(5.3); //浮点型 默认double

          //左边是long型,右边是int型,将int型转为long型储存在a 是自动类型转换
            long a=5;
            System.out.println(a); 
          //左边是double型,右边是float型,将float型转为double型储存在b是自动类型转换
          double b=2.5F;
          System.out.println(b); 
          //左边是float型,右边是long型,将long型转为float型储存在c是自动类型转换
          float c=80L;   
          System.out.println(c); 
       }

测试结果

一个 int 类型变量和一个 byte 类型变量进行加法运算, 结果会是什么数据类型?
用下面数据自己测试一下试试!

int a = 1;
byte b = 2;
byte x = b + i; // 报错
int j = b + i;//正确
 所以运算结果变量的类型将是 int 类型。
 所以说,自动转换:是将取值范围小的类型 自动提升为 取值范围大的类型 。
 那么,为什么能变成int而不是byte呢?、
 因为 byte一个字节,而int四个字节  再计算的时候 会将byte补充为4个字节之后再和int型数据计算,所以最后结果为4个字节为int型。

同理,当int和double计算时,结果将会变为double型。

总结从小到大范围:byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double

强制类型转换

特点:需要修改代码,不能自动转换
规则:小类型 变量名=(小类型)大数据

运行以下代码:

public class test{ 
      public static void main(String[] args){
          //左边是int型,右边是long型,将long型转为int型,是从大到小转换,不是从小到大,不能自动转换
          int a=100L;
          System.out.println(a);
       }
}

运行结果
修改以后的代码

按照规则:小类型 变量名=(小类型)大数据 进行修改后运行 将long强转为int型

public class test{ 
      public static void main(String[] args){
          //左边是long型,右边是int型,将int型转为long型储存在a 是自动类型转换
          int a=(int)100L;
          System.out.println(a);
       }
}

运行结果

运行以下代码,将会输出66 为什么 因为char型的字母A对应ASCII表中的65 所以char型数据在进行数学运算时会变为对应数字

public class test{ 
      public static void main(String[] args){
   char a='A';
          System.out.println(a+1);
       }
}

运行结果

注意事项

强制类型转换一般不推荐使用的 因为可能出现两个问题:溢出,精度损失。
int 强制转成 short 砍掉2个字节,可能造成数据丢失。

精度损失

看下方代码:

int i = 1.5; // 错误

这里显然不能将double型自动转为int
double 类型内存8个字节, int 类型内存4个字节。 1.5 是 double 类型,取值范围大于 int 。可以理解为 double 是8 升的水壶, int 是4升的水壶,不能把大水壶中的水直接放进小水壶去。想要赋值成功,只有通过强制类型转换,将 double 类型强制转换成 int 类型才能赋值。
如何修改呢?如下:

int i = (int)1.5;

输出结果是什么 ? 答案是1 (切记不是四舍五入,不然输出就是1了 这里是直接去掉小数点的 即使是1.99也是输出1) 这就叫做精度损失

溢出

// int i = 8888888888; //显然是错误的 8888888888已经超出的int的最大表示范围 会报错
int i= (int)8888888888L // 输出298954296 因为溢出了

发布了37 篇原创文章 · 获赞 24 · 访问量 673

猜你喜欢

转载自blog.csdn.net/qq_16397653/article/details/103529796