自动类型转化

自动转化类型底层原理:

byte a = 12;
int b = a;
System.out.println(b);

a= 00001100(8位)

b=00000000 00000000 00000000 00001100(32位) 

结论:类型范围小的变量,可以直接赋值给类型范围大的变量 。

补充:

java 里类型的转换 java类型转换的原理_类型转化

总结:1、为什么要进行类型转换?

存在不同类型变量赋值给其他类型的变量。

2、类型范围小的变量,可以直接赋值给类型范围大的变量 。


表达式中的自动类型转化

在表达式中,同样的,类型范围小的变量,可以直接赋值给类型范围大的变量再运行。

java 里类型的转换 java类型转换的原理_类型转化_02

注意事项:1、表达式的最终结果类型由表达式中的最高类型决定。

                   2、在表达式中,byte,short,char 是直接转化成 int 类型参与运算的。 

public class TypeDemo{
    public static void main(String[] args)
    //目标掌握表达式自动类型转化规则
    byte a =10;
    int b =20;
    double c =1.0:
    double rs = a + b + c;
    system.out.println(rs);
}
//输出结果是31.1

总结:表达式的最终结果类型,是由表达式的最高类型决定。


强制类型转化

强制类型转化底层原理:

例子1(强制转化类型没有超出变量类型范围)  要把 int 类型变量 a=20,强制转化成 byte 类型变量 b

首先计算一下20的转化成二进制是多少。

java 里类型的转换 java类型转换的原理_类型变量_03

通过计算器得到答案是:10100

 最后写出表达式 byte b = (byte)a;

//这次运行结果是 20

java 里类型的转换 java类型转换的原理_类型变量_04

例子2(强制转化类型超出了变量类型范围)要把 int 类i=150,强制转化成 byte 类型变量 j

首先计算一下150的转化成二进制是多少。

java 里类型的转换 java类型转换的原理_java 里类型的转换_05

 通过计算器得到答案是:1001 0110

 最后写出表达式 byte j = (byte)i;

//这次运行结果是 -36 

//为什么这次的运行结果不像想象的那样是1500了呢,其实是因为强制转化类型超出了变量类型范围

java 里类型的转换 java类型转换的原理_java 里类型的转换_06

 于是运行后,j 变量只取到了 i 变量的后八位(11011100),所以转化为十进制是36。

原码和补码的知识:为什么转化成十进制以后是负数了,因为二进制第一位是符号位,而此处11011100,第一位是1,所以最终结果是负数。

原码, 反码, 补码是机器存储一个具体数字的编码方式. 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: 第一位是符号位.

java 里类型的转换 java类型转换的原理_java_07

总结:

java 里类型的转换 java类型转换的原理_java_08