Java零基础24-Java的数值类型相互转换

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shilishili/article/details/88397413

阅读完后:

  • 基本数据类型之间的转换【掌握】
  • 自动类型转换【掌握】
  • 强制类型转换【掌握】
  • 操作时超出超出取值范围分析【了解】

前言

我们开始学习 Java 的数据类型转换,数据类型转换就是把数据的类型转换为另一种类型。Java 有严格的数据类型限制,基本数据类型中数值类型之间可以互相转换,布尔类型不能与它们之间进行转换。
数据类型转换分为两种:自动类型转换、强制类型转换。

自动类型转换

自动类型转换就是需要类型之间转换是自动的,不需要采取其他手段。总的原则是存储空间小的数据类型可以自动转换为存储空间大的数据类型。
自动类型转换不仅发生在赋值过程中,在进行数学计算时也会发生自动类型转换,在运算中往往是先将数据类型转换为同一类型,然后再进行计算。

如果多个不同数据进行数学计算,在计算过程中,它们会先转换成存储空间最大的那个类型。

自动类型转换可以由小到大分别为 byte->short->int->long->float->double
在这里插入图片描述

注意:char 类型比较特殊,char 自动转换为 int、long、float 和 double。但 byte 和 short 不能自动转换为 char,而且 char 也不能自动转换为 byte 或 short。

计算过程中自动类型转换规则,表格如下:

编号 操作数 1 类型 操作数 2 类型 转换后的类型
1 byte、short、char int int
2 byte、short、char、int long long
3 byte、short、char、int、long float float
4 byte、short、char、int、long、float double double

示例代码如下:

// 编号1 示例
byte myByte = 10;
short myShort = 100;
char myChar = 1000;
int myInt = 10000;
int result1 = myByte + myShort + myChar + myInt;
System.out.println(result1);		// 输出:11110

// 编号2 示例
long result2 = myByte + myShort + myChar + myInt;
System.out.println(result2);		// 输出:11110

// 编号3 示例
long myLong = 100000;
float result3 = myByte + myShort + myChar + myInt + myLong;
System.out.println(result3);		// 输出:111110.0

// 编号4 示例
float myFloat = 1000000.0F;
double result4 = myByte + myShort + myChar + myInt + myLong + myFloat;
System.out.println(result4);		// 输出:1111110.0

强制类型转换

强制类型转换是缩小转换,将存储空间大的类型转换存储空间小的类型,强制类型可以由大到小分别为:double->float->long->int->short->byte,强制转换可能会丢失数据或精确度。

强制转换表达式:
(将要转换的数据类型)变量名称;

- 强制类型转换可能会丢失数据,示例代码如下:

short myShort = 120;
System.out.println(myShort);	// 输出:120
byte myByte = (byte)myShort;  	// 将 short 类型强制转换为 byte 类型
System.out.println(myByte);		// 输出:120

short 类型的值 120,二进制为 0000 0000 0100 1000,将 short 类型强制转换为 byte 类型,最后得出 byte 类型的二进制为 0100 1000,最后结果为 120。图解如下:

short 类型强制转换为 byte 类型
short 类型强制转换为 byte 类型

- 强制类型转换可能会丢失精确度,示例代码如下:

double myDouble = 123.456;
System.out.println(myDouble);	// 输出:123.456
int myInt = (int)myDouble;		// 将 double 类型强制转换为 int 类型
System.out.println(myInt);		// 输出:123

最后输出:123
由于 int 类型是不带小数点的。所以,将 double 强制转换为 int 类型,将会丢失精确度。

- 强制类型转换可能超出范围

当 short 类型强制转换为 byte 类型时,如果转换后的结果值超出范围,示例代码如下:

short myShort = 200;
System.out.println(myShort);	// 输出:200
byte myByte = (byte)myShort;  	// 将 short 类型强制转换为 byte 类型
System.out.println(myByte);		// 输出:-56
short 类型强制转换为 byte 类型
在这里插入图片描述

超出最大值的取值范围的计算分析如下:
一、当 short 类型的值为 200,转换为二进制:0000 0000 1100 1000,二进制的首位是符号位,它决定着数值是正数还是负数,0 表示正数,1 表示负数(红色表示为二进制首位)。
二、由于 short 类型是 16 位,byte 类型是 8 位,所以 short 类型转换为 byte 类型时,short 类型将最后 8 位赋值给 byte 类型,最后 byte 类型的二进制位:1100 1000。
三、计算得知 1100 1000 超出了 byte 取值范围。所以,我们需要将当前的二进制数进行取反再加1,得出最终的结果。首先将 1100 1000 取反计算得出结果:0011 0111(其实取反的操作是操作 16 位,而不是 8 位,所以,实际结果为 1111 1111 1100 1000,符号位是 1 表示负数)。
四、再将 0011 0111 进行加1,在二进制中,是逢 2 进 1,最后计算得出结果:0011 1000,转换为十进制为:56。由于符号位是负数,所以最终结果为:-56。

超出最大值的取值范围是,我们只需要对 16 位的前 8 位进行取反就可以得出最终值。
例如:
一、-200 的二进制 1111 1111 0011 1000 强制转换为 byte 类型
二、将二进制取反得出:0000 0000 0011 1000
三、去掉前 8 位并赋值给 byte 类型:0011 1000,符号位是1 表示正数,最后得出结果:56。

注意:在编程时,计算超出取值范围是没有任何意义的,尽量要避免超出取值范围的出现。

在本章我们学习了:

  • 基本数据类型的自动转换是从【小的取值范围】到【大的取值范围】的转换过程
  • 基本数据类型的强制转换是从【大的取值范围】到【小的取值范围】的转换过程
  • 基本数据类型的强制转换可能会丢失数据或精确度
  • 超出最大值取值范围的计算方式:取反再加1
  • 超出最小值取值范围的计算方式:前 8 位取反

接下来,我们开始学习 Java 数组:Java零基础25-Java数组

猜你喜欢

转载自blog.csdn.net/shilishili/article/details/88397413