JAVA中,char(两字节) short(两字节) byte(一字节) 这三者之间,只有byte->short可以自动转型,其他方向都是不会自动转的
虽然按照惯例,容量大的不能自动转换为容量小的,下面的程序会报错:
但是下面则正确编译了(整形字面量类型为int)
编译器发现右边是字面量而不是变量时,会判断一下是否超过了byte的表示范围,如果没有的话就不会出错
正如前言,以下程序也是正确的
但是,下面的程序却是错误的(小数字面量类行是double)
1.1并没有超过float的表示范围,却被判定无法自动转换
这是因为前面的例子都是整型,在不超过表示范围的情况下发生这种转换是安全的
而浮点型存在【精确度】的问题
double类型的字面量,虽然没有超出float的表示范围,在转换后仍旧会损失精度,所以是不被允许的
总结一(变量)
1、
整型变量之间,自动转型只能发生在变量类型的容量从小到大
而且牵扯到字符型,与数值型之间:char short byte 这三者之间,只有byte->short可以自动转型,其他方向都是不会自动转的
2、
浮点型变量之间,遵从小->大的规则
3、
整型变量能自动转换为浮点型变量
反过来不行
总结二(字面量)
1、
整型字面量不超出等号右边变量的范围的情况下,可以进行赋值(无需强制类型转换)
2、
双精度字面量不能赋值给单精度变量(即使没有超过表示范围也不能)
3、
整型字面量可以赋值给浮点型变量
浮点型字面值不能赋值给整型变量
值得一提的是,下面的程序,即使满足了【整形】【不超出表示范围】两个条件,仍旧是错误的
byte b = (long)1;//错误
byte b = 1L;//错误
short s = (long)1;//错误
如果就这样认为将字面量强制转换后,就不能再赋值给小容量类型的变量,而是单纯进行像变量的类型判断,就错了,因为下面的程序通过了编译
byte b = (int)1;//正确
short s = (int)1;//正确
对于上面两行代码,具有以下猜想(并未证实):
整型字面量本就是int,强制转换成int的动作无效,赋值时编译器仍旧沿用了转型前的字面量判断方法,而非改为类型判断
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)