各种数据类型按照数据范围从小到大依次列出
byte -> short(char) -> int -> long ->float -> double
自动类型转换
范围大的数据类型 变量 = 范围小的数据类型值;
比如
double d = 1000; int i = 100; double d2 = i;
强制类型转换
(小数类型转为整数类型,小数可能被舍弃,出现精度损失,所以需要强制转换)
范围小的数据类型值 变量 = (范围小的数据类型值 ) 范围大的数据类型 ;
如
int i =(int)6.718; //i的值为6 double d = 3.14; int i2 = (int)d; //i2的值为3
注意:布尔类型Boolean不能参与类型转换。
还有一点我们需要注意的是在进行强制转换时要注意数据的溢出问题。
比如byte类型的范围是-128~127
0000 0001代表的是数字1
1000 0000代表的就是-1
正数最大位0111 1111,也就是数字127
负数最大为1111 1111,也就是数字-128
byte占8位,而int类型占32位,当由int强制类型转化为byte时,系统就采取了截取int后8位的做法,
java中使用补码的形式表示,补码表示的时候第一位是符号位,0正1负
那么129在内存中的表示形式:00000000 00000000 00000000 10000001
这样截取后8位就变成10000001所以这个肯定是负数了,然后看它的数值部分0000001
补码由正数变负数,还是负数变正数,方法: "按位取反,再加1
所以0000001应该变为1111110 + 1 = 1111111(即127)
又因为是负数,所以就截取变成-127了
byte a=(byte) -129; System.out.println(a);//输出127
byte a1=(byte) 129; System.out.println(a1);//输出-127
*面试陷阱
byte b1 = 10; byte b2 = 11; //错误: 不兼容的类型: Java默认为int类型,这两个数相加将会变成int类型,从int转换到byte可能会损失精度,必须强制类型转换 //否则,两个操作数都将转换为int类型。 byte b3 = b1 + b2 //错误 byte b3 = (byte)(b1 + b2); //正确
*面试陷阱2:
short s1 = 1; s1 = s1 + 1; //错误: 不兼容的类型: 从int转换到short可能会有损失,和上面的一样。 short s2 = 1; s2 += 1; // 等同于short s2 = (short)(s2 + (short)1); //正确
其中char 还可以当做成一种特殊的整数类型
char c1 = 'a'; int i3 = c1; //自动转换 int i4 = 100; //char c2 = i4;// 错误: 不兼容的类型: 从int转换到char可能会损失精度
char a1=97; System.out.println(a1);//输出a,char类型表示的整数类型对应ASCII编码表