Java中强制类型转换
一、整型强转
类型转换都是小范围向大范围转换的,大范围往小范围转化需要用到强制转换,转换后的值会有所损失。
不同数据类型精度由小到大排列如下:char-->byte --> short --> int --> long --> float --> double
先让我们一起看看小精度数据类型向大精度数据类型转换会出现什么问题吧。
class test02{public static void main(String[] args){byte b1=100;System.out.println(b1);}
}
输出结果如上,我们知道Java开发过程中数值默认输出为 int 型,但是明明 byte 比 int 小为什么输出结果没有问题呢?
那是因为,100在byte型(- 128~127)数值的范围内,所以输出没有问题,同理可得,只要被赋的值在小精度数据类型的范围内,输出结果都是没有问题的。
那如果被赋的值超出范围了会出现什么问题呢?
class test02{public static void main(String[] args){byte b2=300;System.out.println(b2);}
}
输出结果如上,它说:从int转换到byte可能会有损失,那到底会损失成什么样呢? 损失的原理是什么呢?
我们可以尝试强制转换,将int型强制转换为byte型,转换的方法就是在被赋的值前面加(byte)
class test02{public static void main(String[] args){byte b3=(byte)300;System.out.println(b3);}
}
可以看到,经过强制转换后的100变为了44,原理如下:
int型数值的存储大小为4字节,byte为1字节,那么
int型 100 的二进制数为00000000 00000000 00000001 0010 1100,强制转换为byte型数值后,它的二进制数就会变为1字
节,前面的3个字节都会被损失掉,即变为 0010 1100,将它换算为十进制数就是输出结果44啦~
哪么两个相加不超范围的byte数,输出结果会是怎样的呢?
class test02{public static void main(String[] args){byte b7=50;byte b8=50; byte b9=b7+b8;System.out.println(b9);}
}
这是为什么呢? 50 + 50 =100,没有超出范围呀,怎么还是报错了呢?原因是这样的:
b9并不知道b7和b8是什么类型的数值,所以为了避免出现二义性,该程序不予以计算,就出现了上述结果啦~
short转int 如果赋值不当,出错结果同上。
那么我们再来看一段程序:
class test02{public static void main(String[] args){int i1=300;int i2=300;int i3=(int) i1 + i2;System.out.println(i1);System.out.println(i3);}
}
咦~这次输出结果怎么没有出现问题呢?
是因为Java中默认数据类型为int型,左右两边类型一致,当然不会出错啦~
如果数值过大超出int型怎么办?答案就是在整数常量后面+ l 或者L将其转换为 long常量,那么对于超级大的数字比如:1234456749143769471835, 超过long的取值范围了怎么办?答案就是调用 BigInteger BigDecimal 两个函数去解决。
二、浮点型强转
由上述案例可得,从double转换到float可能会有损失,所以解决方案就是在float类型的常量后面+F
class Test02{public static void main(String[] args){float f=3.14F;System.out.println(f);double d=10;System.out.println(d);double d1=3.14;double d2=3.14;double d3=d1+d2;System.out.println(d3);}
}
输出结果如上。
如何打印一个字符变量呢?
先去码表中找到编号相对应的字符,然后将字符编号赋给字符变量,最后打印即可,比如在ASCII码表中小写字母“a”对应97号,那么就将97 赋给字符变量即可,代码实现如下
class test02{public static void main(String[] args){char c1=97;System.out.println(c1);char c2='A';System.out.println(c2);}
}
还有就是将一个字符常量赋给字符变量时,那么无论如何赋值,一旦打印结果一定是字符,如上。
字符变量在参与运算时,是以编号身份参加的,那么如何查看'我'这个字符的编码呢?直接输出 System.out.println('我'+0);查看
我 的编码是多少,然后再输出打印即可。
同理,我 前后的字符也可以由此实现,具体代码如下。
class test02{public static void main(String[] args){System.out.println('我'+0);char c= 25105;System.out.println(c);System.out.println((char)('我'+1));System.out.println((char)('我'-1));System.out.println((char)8888888);}
}
为啥会出现问号呢?是因为ASCII码表中没有该编号,所以出现了 问号。
请使用至少两种方式求符号'我'的Unicode码
|-- 自动类型转换
|-- 强制类型转换
public class Type {public static void main(String[] args) {char a ='我';//方法1:自动类型转换int b =( a + 1) - 1;System.out.println(b);//方法2:强制类型转换int c = (int)a;System.out.println(c);}
}