标签:数据类型 转换 sys 操作符 类型提升 code sof 一个 height
float b = 1.5; // 编译出错 Type mismatch: cannot convert from double to float,1.5默认是一个double型,不能自动转换为float类型
float b2 = (float) 1.5; // 编译正确。进行强制类型转换
float b3 = 1.5f; // 编译正确。直接用一个float类型的数值给b3初始化
double d = 0;
float f = (float) d;
int i2 = (int) f;
long l = (long) f;//注意,虽然long有64位,而float只有32位,但float->>long时也需要强制类型转换
System.out.println((byte) 127 + " " + (byte) 128 + " " + (byte) 255 + " " + (byte) 256); //127 -128 -1 0
byte b1 = 3; //编译正确。如果此int型数值在数值类型byte的范围内,则jvm会自动进行一次隐式类型转换,将此int型数值转换成byte类型
byte b2 = 1000; //编译出错 Type mismatch: cannot convert from int to byte,注意,错误的原因是"在隐式类型转换后发现超出了byte边界",所以jvm就不进行"隐式类型转换"了
byte b3 = (byte) 1000; // 编译正确。进行强制类型转换
byte p = 3; // 编译正确:int到byte编译过程中发生了【隐式类型转换】
int a = 3;
byte b = a; // 编译出错:cannot convert from int to byte。
byte c = (byte) a; // 编译正确。强制类型转换
float f = 5;//编译正确。整数默认是int类型,此时直接发生了【自动类型提升】
double d = 1.5f;//编译正确。float类型的浮点数赋值给double类型,此时直接发生了【自动类型提升】
long l = ‘a‘;//编译正确。字符‘a‘被当做int类型的97后赋值给long类型,此时直接发生了【自动类型提升】
long l_maxInt = 21474_83647;//编译正确。
long l_bigerThanMaxInt = 21474_83648;//编译出错:The literal ** of type int is out of range。由于数值**【超过了int类型的范围】,故而其自身已经编译出错
long l_endWithL = 21474_83648L;//编译正确。如果一个整数以字母L或l结尾,则其类型为long类型;否则为默认的int类型
int i_outOfRange = Integer.MAX_VALUE + 1;//编译正确。虽然结果溢出,但是程序没有任何问题,所以需要开发中自己留意溢出问题
byte b = 3;
char c1=b;//编译错误:Type mismatch: cannot convert from byte to char
char c2 = ‘a‘;
short s1 = c2;//编译错误:Type mismatch: cannot convert from char to short
short s2 = b;//编译正确。自动类型提升
byte b = 50;
char c = ‘a‘;
short s = 1024;
int i = 50000;
float f = 5.67f;
double d = 0.1234;
double result = (f * b) + (i / c) - (d * s);
System.out.println("(f * b)=" + (f * b) + " (i / c)=" + (i / c) + " (d * s)=" + (d * s) + " result=" + result);
//(f * b)=283.5 (i / c)=515 (d * s)=126.3616 result=672.1384
//第一个表达式 f * b 中,b被提升为float类型,该子表达式的结果也提升为float类型。
//第二个表达式 i / c 中,变量c被提升为int类型,该子表达式的结果提升为int类型。
//第三个表达式 d * s 中,变量s被提升为double类型,该子表达式的结果提升为double型。
//最后,这三个结果类型分别是float,int和double类型,想减后该表达式的最后的结果就是double类型。
float f = Integer.MAX_VALUE;
System.out.println(Integer.MAX_VALUE + " " + f);//21474_83647 2.1474_8365E9(呐,被"消尾"了,已经由"精确值"变成了"近似值")
byte b = 0, b1 = 1, b2 = 2;//【隐式类型转换】
b = b1 + b2; //编译出错,Type mismatch: cannot convert from int to byte。进行 b1 + b2 运算时会先将b1和b2【自动类型提升】成为int,运算结果也是int,赋给byte类型的b1时需要强制转换(向下转型)
b = b + 0;//编译出错,同上面的错误一样,运算时会先将b【自动类型提升】成为int,运算结果也是int
b = (byte) (b1 + b2);//编译正确。【强制类型转换】
b += b2; //编译正确。【自加】没有自增类型提升问题。编译器在编译的时候自动进行了强转,相当于 b = (byte) (b + b2)
//一个奇葩的情况
final byte b3 = 3, b4 = 4;
b = b3 + b4;//编译正确。有【final】修饰的变量相加后【不会被自动提升】为int类型
//一个更奇葩的情况
final byte b6 = Byte.MAX_VALUE, b7 = 0, b8 = 1;
b = b6 + b7;//编译正确。
b = b6 + b8;//编译出错,Type mismatch: cannot convert from int to byte。注意,错误的原因和【long l = 21474_83648】一样,是因为由于数值**【超过了byte类型的范围】,故而其自身已经编译出错,而不是因为需要强制转换(向下转型)
b = 128;//编译出错,但是这里出错的原因我感觉和上面的原因是不一样的
b = (byte) (b6 + b8);//编译正确。强制转换后肯定没问题啦!
标签:数据类型 转换 sys 操作符 类型提升 code sof 一个 height
原文地址:http://www.cnblogs.com/baiqiantao/p/7442114.html