Java基础语法(二)—基本数据类型转换

一、基本数据类型转换

     8种基本数据类型除了boolean类型外,都可相互转换。

1.自动类型转换

  • 变量在做运算的时候,可能产生溢出的情况,那么此时java语言将采用自动类型转换的方式来处理。
  • 小空间的数据类型和大空间的数据类型的数运算时,会向大空间的数据类型转换。

    byte–>short–>int–>long–>float–>double

         (1) byte、short、char类型在做计算的时候会自动的把数据类型提升为 int 型

    class Demo1{
    public static void main(String[] args){
        //byte在做运算的时候会自动的提升成int型
        byte a = 16;
        //错误:byte b = a + 1;
        int b = a + 1;
        System.out.println(b);
    
        //char类型的数据在参与运算的时候,每一个char背后都对应一个数值类型ASCII码,参与计算的是ASCII码
        char c = 'a'; //这里的字符a对应的十进制数为97
        int d = c + 1;
        System.out.println(d);
        }
    }

         (2) int 类型和其他的数值计算时,也会溢出,但int不会提升 而是直接损失精度

    class Demo1{
    public static void main(String[] args){
    
        //int一旦达到最大值就会损失精度
        int e = 2147483647; //2147483647 为int的最大值
        //int不能提升成long
        long f = e + 1;
        System.out.println(f); //f = -2147483648
        }
    }
                  int 为4个字节,所以int 的最大值为:
                  0111 1111 1111 1111 1111 1111 1111 1111
                  +                                                                  1

                  1000 0000 0000 0000 0000 0000 0000 0000

     (3) 任何的整数类型和 long 类型做运算都会转换成 long 类型

class Demo1{
public static void main(String[] args){

    long l1 = 200; 
    byte a = 10;
    long l2 = l1 + a;
    System.out.println(l2); // l2 = 210
    }
}

     (4) 常量在做运算的时候,只要不超出定义的数据类型的范围就不会报错,不会发生数据类型的自动提升

class Demo1{
public static  void main(String[] args){
    //这是不报错的情况
    byte b1 = 3 + 20;
    System.out.println(b1); // b1 = 23

    //这是报错的情况
    byte b2 = 127 + 1; // 会造成溢出
    System.out.println(b2);
    }
}

     (5) float 类型(或double类型)和常量计算,会自动转换成 float 类型(或double类型)

class Demo1{
public static  void main(String[] args){
    float f1 = 15.3f;
    float f2 = f1 + 1;
    System.out.println(f2); // f2 = 16.3
    }
}

     (6) float 类型和 float 类型计算,不会有数据类型的提升

class Demo1{
public static  void main(String[] args){
    float f1 = 15.3f;
    float f2 = 10.0f;
    float f3 = f1 + f2;
    System.out.println(f3); // f3 = 25.3
    }
}

     (7) float 类型(或者double类型)和任何整数类型计算,都会转换成 float类型(或者double类型)

class Demo1{
public static  void main(String[] args){
    byte b = 100;
    short s = 20;
    int i = 40;
    long l = 100;
    float f = 13.2f;

    float f1 = f + b;
    System.out.println(f1); // f1 = 113.2

    float f2 = f + s;
    System.out.println(f2); // f2 = 33.2

    float f3 = f + i;
    System.out.println(f3); // f3= 53.2

    float f4 = f + l;
    System.out.println(f4); // f4 = 113.2
    }
}

     (8) double 类型和 float 类型计算,会自动转换成 double 类型

2.强制类型转换

  • 大空间的数据类型向小空间的数据类型去转换。
  • 语法:<目标数据类型>变量名

         (1) int型转换为byte型

    // 数值8是既在int范围里,也在byte范围里,所以转换之后不会有啥问题
    
    class Demo1{
    public static void main(String[] args){
        // 把int型强制转换成byte型
        int i = 8;
        byte b = (byte)i;
        System.out.println(b); // b= 8
        }
    }
转换原理:
int 类型的8:      00000000 00000000 00000000 00001000
short 类型的8:                                    00000000 00001000
byte 类型的8:                                                      00001000
通过观察截取之后的二进制数 0000 1000 最高位符号位是0,所以这是一个正数,而计算机中所有的数据都是以补码的形式出现的,所以要计算它的补码;
正数:原码 = 反码 = 补码

最终看到的结果还是:0000 1000(最高位符号位不运算,数值位转化为十进制的8,因0为正,所以为+8)

// 数值130是只在int范围里,不在byte范围里,所以这里强制转换之后会损失精度

class Demo1{
public static void main(String[] args){
    // 把int型强制转换成byte型
    int i = 130;
    byte b = (byte)i;
    System.out.println(b); // b = -126
    }
}
转换原理:
数据130是int类型的十进制数据;
第一步:十进制的130转换成二进制数据 1000 0010;
第二步:占4个字节的int型,做截取的过程如下:
          int 类型的130:     00000000 00000000 00000000 10000010
          byte 类型的130:                                                     10000010
通过观察最高位符号是1,所以这是一个负数,而计算机中所有的数据都是以补码的形式出现的,所以要算它的补码;
      原码:1000 0010(原码变反码:最高位符号位不变,其他数值位0变1,1变0)
      反码:1111 1101(反码变补码:反码加1即可得)
      补码:1111 1110

最终看到的结果就是:1111 1110(最高位是符号位不运算,数值位转化为十进制得126,因1为负,所以为-126)

     (2) float型转换为int、byte、short、long型,都是一样的(下面以int为例)

class Demo1{
public static void main(String[] args){
    // 小数强制转换为整数后,会舍弃小数位
    float f = 12.5f;
    int i1 = (int)f;
    System.out.println(i1); // i1 = 12
    }
}

     (3) double 类型转化成 float类型

class Demo1{
    public static void main(String[] args){
        // double数据类型转换成float类型
        double d = 20.3;
        float f = (float)d; 
        System.out.println(f); // f = 20.3
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值