类型转换

类型转换

由于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
posted @ 2021-07-07 00:51  阿飞bean  阅读(77)  评论(0)    收藏  举报