类型转换:
不同类型的变量相互赋值时
强转语法(显式):
范围小的数据类型 变量名 = (范围小的数据类型)范围大的数据类型
自转(隐式):
等号左边是范围大的数据类型 等号右边范围小的自动转为范围大的
int a = 10;
long b = 100L;
b = a;//可以通过编译
//a的范围小 b的范围大 将a赋值给b时 编译器自动将a提升为long类型后赋值
a = b;//编译失败
//long的范围比int范围大 会有数据丢失 不安全
a = (int)b;//强转后,编译成功
特殊情况:
byte g = 127;//[-128,127]
//此时 当给byte类型赋值的时候,数据如果没有超过byte的取值范围的时候,编译器认为这是合理的
byte h = (byte)128;// -128
byte c = (byte)127;
byte d = (byte)128;
byte e = (byte)129;
System.out.println(c + " " + d + " " + e + " ");// 127 -128 -127
在Java中 当参与运算数据类型不一样时 会进行类型转换
Java类型转换分为两类 自动类型转换(隐式) 强制类型转换(显式)
隐式 小转大
数据范围小的自动转换为数据范围大的
显式 大转小
数据范围大的转换为数据范围小的需要强转
不同数字类型的变量之间赋值,表示范围更小的类型能隐式转换成范围较大的类型
如果需要把范围大的类型赋值给范围小的,需要进行强制类型转换,但可能精度丢失
将一个字面值常量进行赋值的时候,Java会自动针对数字范围进行检查
强制转换不一定能成功,不相干的类型不能相互转换(比如boolean)
强转的缺陷:
精度的可能丢失
int a = 10;
double b = 20.2;
System.out.println(a + (int)b);
数据溢出
int i = 1080;// 4字节
byte m = (byte)i;// 1字节
类型提升:
不同类型的数据之间相互运算时(除boolean) 数据类型小的会被提升到数据类型大的
小升大
int和long之间 int会被提升为long
int aa = 10;
long bb = 20;
int cc = aa + bb;//编译出错 int+long-->long+long 赋值给int时会丢失数据
long dd = aa + bb;//编译成功 int+long-->long+long 赋值给long
byte与byte的运算
byte a = 10;
byte b = 20;
byte c = a + b;//编译出错
//a b都是byte 但是计算a+b时会先将a和b都提升成int 再进行计算 得到的结果也是int
//计算机cpu通常是按照4个字节为单位从内存中读写数据
// 对于short byte这种比4个字节小的类型 会先提升成4个字节的int 再进行运算
byte d = (byte)(a + b);//这样就可以了
int转String
int a = 10;
String s = String.valueOf(a);
System.out.println(s);
String str = a+””;
//字符串和其他类型相加 结果是字符串?
int a = 10;
int b = 20;
System.out.println(a+b+" hello");//30 hello
System.out.println("hello"+a+b);//hello1020
String转int
String str = “12345”;
int ret = Integer.parseInt(str);
System.out.println(ret);
所有的byte、short、char类型被自动提升到int类型,再参与运算
int a = 'a' + 1;//98
//char自动提升为int类型