类型转换
类型转换
由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。
容量的大小由低到高
低----------------------------------------------------------------->高
(byte,short,char )→ int → long → float → double
(小数的优先级大于整数,所以float只有32位却在64位的long后面)
运算中,不同类型的数据先转化为同一类型,然后进行运算。
强制类型转换
强制转换 :(打算转换成的数据类型)变量名 例如:
int i = 128;
byte b = (byte) i;
System.out.println(b);//-128
public class Demo04 {
public static void main(String[] args) {
int i = 128;
byte b = (byte) i;
System.out.println(i); //128
System.out.println(b); //-128
System.out.println("==================分割线===================");
//可查看java.lang包下的Byte类的源码,可发现byte的取值范围为-128~127,
//故产生内存溢出,b取得-128的值,原因:在计算机内存存放的数值都是补码形式,第一位为符号位
//128的二进制是1000 0000,即128的源码为1000 0000,其为正数补码和源码相同,也是1000 0000(这里为8位的二进制码,int类型的128原码应该是0000 0000 0000 0000 0000 0000 1000 0000)
//负数的补码为:符号位不变,其余位取反后再加1。
//第一是为了能让计算机执行减法:[a-b]补=a补+(-b)补,第二个原因是为了统一正0和负0
//第二是为了避免符号位的特殊处理,在原码和反码表示中,进行加减运算时需要对符号位进行特殊处理。而补码表示下,符号位可以和数值位一起参与运算,无需特殊处理,进一步简化了运算过程。
//正零:00000000
//负零:10000000
//这两个数其实都是0,但他们的原码却有不同的表示。但是他们的补码是一样的,都是00000000
// 例如
int i2 = 129;
byte c = (byte) i2;
System.out.println(i2); //129 其补码为1000 0001
System.out.println(c); //-127 其二进制位111 1111,则源码为1111 1111,补码为1000 0001
// 而byte最多只占8位第一位为符号位0代表正,1代表负,根据规定1000 0000是-128的补码
}
}
强制类型转换适用于 优先级高(容量高)的数据类型转优先级低(容量低)的数据类型,即高→低
自动类型转换
自动转换用于由优先级低(容量低)的数据类型转优先级高(容量高)的数据类型,即低→高, 不需要任何操作,直接定义即可,例如
int i = 128;
double d = i; //自动转换 低->高
System.out.println(d); //128.0

浙公网安备 33010602011771号