• Java类型转换和类型提升


    目录

    一、类型转换

    1.1 自动类型转换(隐式)

    1.1.1 int 与 long 之间

    1.1.2 float 与 double 之间

    1.1.3 int 与 byte 之间

    1.2 强制类型转换(显示)

    1.2.1 int 与 long 之间 

    1.2.2 float 与 double 之间 

    1.2.3 int 与 double 之间

    1.2.4 int 与 byte 之间

    二、类型提升

    2.1 int 与 long 之间

    2.2 byte 与 byte 之间


            Java作为一个强类型的编程语言,当不同类型进行相互赋值的时候,会有严格的校验。

    就比如下面这几行代码。

    int a = 10 ;
    long b = 100L ;
    b = a ; // 可以通过编译
    a = b ; // 编译失败
            如上代码,将int型变量a赋值给long型b的时候可以通过编译,但是将长整型变量b赋值给a的时候会编译失败。出现这样的情况就是因为Java对数据具有严格都校验。那么接下来小编就为大家分享一下,Java中,数据之间的赋值是发生怎样的类型转换和提升的。
            在java中,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式)和强制类型转换(显示)。

    一、类型转换

    1.1 自动类型转换(隐式)

    自动类型转换:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。

    特点:数据范围小的转为数据范围大的时自动进行。

    1.1.1 int 与 long 之间

    1. int a = 100;
    2. long b = 10L;
    3. b = a;
    4. a = b;

    如上代码中:将a赋值给b的时候,编译会通过,因为a和b都是整形,a的范围小,b的范围大,当将a赋值给b时,编译器会自动将a提升为long类型,然后赋值。

    将b赋值给a的时候,编译失败,因为long的范围比int范围大,会有数据丢失,不安全。

    1.1.2 float 与 double 之间

    1. float f = 3.14F;
    2. double d = 5.12;
    3. d = f;
    4. f = d;

    如上代码中:同理在将 f 赋值给 d 的时候,编译器会将 f 转换为double类型,然后进行赋值。

    将 d 赋值给 f 的时候,编译不能通过,double表示数据范围大,直接将float交给double会有数据丢失,不安全。

    1.1.3 int 与 byte 之间

    1. byte b1 = 100;
    2. byte b2 = 257;

    我们在写代码的时候,写出来的整数,编译器默认都是int类型。

    如上代码中, 第一行编译通过,虽然100默认是int类型,但是100没有超过byte的范围,编译器隐式将100转换为byte。

    第二行编译失败,257超过了byte的数据范围(-128,127),有数据丢失。

    1.2 强制类型转换(显示)

     强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。                  特点:数据范围大的到数据范围小的。但是可能会造数据丢失。

    1.2.1 int 与 long 之间 

    1. int a = 10;
    2. long b = 100L;
    3. a = (int)b; // long-->int, 数据范围由大到小,需要强转,否则编译失败

    如上代码中:我们将长整型变量b赋值给a的时候,需要进行强制类型转换,否则会编译失败

    格式:a = (int)b;

    1.2.2 float 与 double 之间 

    1. float f = 3.14F;
    2. double d = 5.12;
    3. f = (float)d; // double-->float, 数据范围由大到小,需要强转,否则编译失败

    在将double类型变量b赋值给float类型变量时,数据由大到小,所以也需要强制类型转换

    格式:f = (float)d;

    1.2.3 int 与 double 之间

    1. int a = 10;
    2. double d = 5.12;
    3. a = (int)d; // int没有double表示的数据范围大,需要强转,小数点之后全部丢弃

    如上代码中,如果直接将double型变量d赋值给整型和变量a编译不会通过,因为类型不兼容,不是属于同一类基本数据类型。所以也需要进行强制类型转换,但是转换之后,小数点之后全部丢弃。

    1.2.4 int 与 byte 之间

    1. byte b1 = 100
    2. byte b2 = (byte)257; // 257默认为int,超过byte范围,需要显示转换,否则报错

    如上代码中,第一行代码中,100默认为int,但是没有超过byte的范围,所以编译器会自动隐式转换,在第二行代码中,257超过了byte的范围,所以需要进行强制类型转换,否则就会报错,但是这里强转之后数据会丢失。

    1. boolean flag = true;
    2. a = flag; // 编译失败:类型不兼容
    3. flag = a; // 编译失败:类型不兼容

    如上代码中,编译也是不会通过的,因为a和flag是两个不相干的类型,完全一点管理,所以不能进行赋值,也不能进行强转类型不兼容。

    注意:

    ①不同数字类型的变量之间赋值 , 表示范围更小的类型能隐式转换成范围较大的类型
    ②  如果需要把范围大的类型赋值给范围小的 , 需要强制类型转换 , 但是 可能精度丢失
    ③  将一个字面值常量进行赋值的时候 , Java 会自动针对数字范围进行检查
    ④  强制类型转换不一定能成功,不相干的类型不能互相转换

    二、类型提升

    类型提升:不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的

    2.1 int 与 long 之间

    int 会被提升为 long
    1. int a = 10;
    2. long b = 20;
    3. int c = a + b; // 编译出错: a + b==》int + long--> long + long 赋值给int时会丢失数据
    4. long d = a + b; // 编译成功:a + b==>int + long--->long + long 赋值给long

    如上代码,第三行会编译出错,因为int型和long型进行运算的时候,int型会被类型提升为long型,再与然后在进行运算,最后结果为long型,所以将long型赋值给int型c的时候会丢失数据。

    2.2 byte 与 byte 之间

    1. byte a = 10;
    2. byte b = 20;
    3. byte c = a + b;
    4. System.out.println(c);

    如上代码,编译也会出错,因为所有小于四个字节的数据类型,在运算的时候会被提升为int类型在进行运算,所以a+b的结果为int型。

    正确写法:

    byte a = 10 ;
    byte b = 20 ;
    byte c = ( byte )( a + b );

    结论:

    byte byte 都是相同类型 , 但是出现编译报错 . 原因是 , 虽然 a b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算 , 得到的结果也是 int, 这是赋给 c, 就会出现上述错误 .
    由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据 . 为了硬件上实现方便 , 诸如 byte short 这种低于 4 个字节的类型 , 会先提升成 int, 再参与计算。
    好啦,到这里,今天为大家分享类型转换和类型提升已经分享完了。如果觉得小编写的可以的,可以给小编一键三连,和小编一起学习和进步,你的关注是对小编最大的鼓励。有什么相关的问题欢迎到评论区留言。谢谢大家!
  • 相关阅读:
    多线程七夕特别版(二)互斥锁-死锁-等待通知机制
    测试工程师面试题,你都遇到过哪些呢?
    02 一些Keil ARM汇编伪指令
    Spring:怨种的我和这玩意死磕到半夜12点20的这件事?
    java面试题之找出1至1000以内的质数
    2022杭电多校第五场题解
    神经网络初始化实例化的维度与调用输入数据的维度
    Kafka-消息系统
    为什么同样是测试,他能年薪50W?
    后厂村路灯:苹果签名是什么? 苹果签名有什么作用?苹果签名能做什么?原理是什么?有哪些方式?
  • 原文地址:https://blog.csdn.net/shixiong_/article/details/133551148