Java是一种强类型数据语言,这意味着必须为每一个变量都需要声明一种类型。Java主要有四类八种基本类型,包括4种整型、2种浮点型、1种字符类型和1种char字符类型。
在使用基本数据类型时,我们注意到每种数据类型是有取值范围的,以整型为例:
类型 | 字节 | 取值范围 |
Byte | 1 | -128~+127 |
Short | 2 | -32768~+32767 |
Int | 4 | -2^31~+2^31-1 |
Long | 8 | -2^63~+2^63-1 |
从上表中我们知道byte数据类型的取值范围时-128~127之间,那么如果使用超出取值范围的值对一个byte变量进行赋值会发生什么:
byte b=129;
System.out.println("b的值为"+b);
事实上,该程序并不能编译执行,jvm会提示以下错误:
Type mismatch:cannot convert from int to byte
如果我们想强行将129赋给byte变量,就涉及到数值类型之间的转换。在Java中,有两种类型转换方式:自动类型转换和强制类型转换。
1.数值间的类型转换
当使用两个不同类型的数值进行二元操作时(如f+i,f是浮点型,i是整型),先要将操作数转换成同一种类型之后,再进行运算。数值类型之间合法的转换遵循下图:
6条实心箭头表示无信息丢失的数值类型转换;3条虚线表示可能有信息丢失的类型转换。例如将整数123456789赋值给float类型时会丢失一定的精度。
int i=123456789;
float f=i;// f的值位1.23456792E8
2.强制类型转转换
强制类型转换的语法格式是:(targetType)value,强制类型转换是通过截断来实现的:
- 当把一个浮点数强制转换成整数时,截断小数部分仅保留整数。
- 当把一个超出数据范围的数值付给数据类型时,例如把int类型的129转换成byte型整数时,值会变成-127。
float f=9.7f;
int i=(int)f;//i的值为9
byte b=(byte)385;//b的值为-127
System.out.println(Integer.toBinaryString(385));//结果为110000001
int型值为385的整数i的二进制补码为1 1000 0001,总共9位。在强制类型转换时,由于byte类型是一个字节(只能保存8位),所以变量b的二进制补码为1000 0001,对应补码的值为-127。
此外,在对byte型、short型变量进行计算时会发生自动类型提升,将数值转换为int整形然后进行计算。
byte a=1;
byte b=2;
byte c=1+2;//正确,c=3
byte d=a+b;///报错:cannot convert from int to byte
byte e=(byte)(a+b);//正确 ,e=3
因此,如果希望将计算结果保存在byte型、short型变量时需对结果进行强制类型转换。