【精致Java教程】14:常量、变量与运算符(五)

数据类型之间的转换分为两种,一种是自动类型转换,一种是强制类型转换。

自动类型转换###

顾名思义,自动类型转换就是当赋值运算符“=”两边的数据类型不同时Java会自动进行类型转换。在Java中,数据类型转换有以下两条规律可循:

  • 取值范围小的数据类型可以自动转换为取值范围大的数据类型。反过来不行。
  • 整数类型可以自动转换为浮点数类型,但是有可能造成精度损失。反过来不行。

这两条规律可以用下图直观的表示。箭头上方的数据类型可以自动转换为在它之下的任意数据类型。反过来不行。


【精致Java教程】14:常量、变量与运算符(五)_第1张图片

示例代码:

short s = 10;
int i = s;
long l = 3141592653L;

float f = l;
double d = f;

System.out.println("f = " + f);

输出结果为:


f = 3.14159258E9

像以上这样都是自动类型转换,其中f的值为3.14159258E9和3141592653相比就是精度损失。
但是如果反过来:

f = d;
i = l;

就会报错了。


Unicode.java:12: 错误: 不兼容的类型: 从double转换到float可能会有损失
f = d;
^
Unicode.java:13: 错误: 不兼容的类型: 从long转换到int可能会有损失
i = l;
^
2 个错误

强制类型转换###

和自动类型转换相对应,强制类型转换指的是强制将取值范围大的数据类型转换为取值范围小的数据类型或者是浮点类型转换为整形。强转的语法是在在值的前面加上(数据类型),例如:int i = (int)2147483648L
强制类型转换的结果有以下三条规律可循:

  • 只要不超过小数据类型的取值范围,大数据类型强转小数据类型结果相等。
  • 超出小数据类型的取值范围,强转的结果大数据类型的看二进制位的值。例如short是16位,byte是8位。把short强转给byte结果就是看short的前8位是什么。
  • 浮点类型强转为整数类型会丢失小数部分,是直接丢失而不是四舍五入。例如1.5变成1。

示例代码:

System.out.println((int) 2147483648L);
System.out.println((int) 1.5);

运行结果为:


-2147483648
1

本文代码下载:百度网盘

你可能感兴趣的:(【精致Java教程】14:常量、变量与运算符(五))