Java 类型小变大

107 阅读2分钟

「这是我参与2022首次更文挑战的第36天,活动详情查看:2022首次更文挑战

类型转换在项目开发中可以说是无处不在,我们都知道在转换的时候类型从大专小会出现精度丢失的情况,但是从小转大一般不会出现精度丢失的情况。注意这里我说的是一般不会出现精度丢失,那么什么时候会出现精度丢失呢?我们先来看一个常见的面试题:

题目: 以下代码段最终输出结果是什么?

public static void main(String[] args){
   System.out.println((int)(char)(byte)-1);
}

我斗胆猜测对于上述代码的输出值大部分面试人员会给出 -1 的答案,但答案真的是这样吗,我们不妨把上述代码运行起来看一下。

在这里插入图片描述

代码最终输出结果是 65535 ,这是为什么呢?下面我们来讲解一下原因。

一、讲解

首先我们先将前面的代码拆分一下,分别来看看每次转换的输出结果:

public static void main(String[] args){
    int a=-1;
    byte b=(byte)a;
    char c=(char)b;
    int d=(int)c;
    System.out.println("d="+c);
}

在这里插入图片描述

我们通过断点调试可以看出,在执行 byte to char 转换的时候就值就出现了改变。这是因为 byte 是一个有符号类型,但是char 是一个无符号类型。虽然说将一个证数类型转换位另一个范围更大的整数类型时一般会保持其原始值,但是对于 byte to char 来说可不是这样。因此 byte to char 的转换并不是拓宽原始类型的转换,是一个拓宽并摘花原始类型的转换,也就是说先进行 byte to int 然后进行 int to char。

针对前面的面试题目我们可以这样理解: to char。

针对前面的面试题目我们可以这样理解: 首先 int 类型的 -1 二进制是:0b11111111111111111111111111111111 ,int to byte 将会截取低 8 位即 0b11111111 也就是十进制的 -1 ,byte to char 需要先拓展到 int 类型结果为 0b11111111111111111111111111111111 ,然后进行 int to char 转换结果为 0b1111111111111111 也就是十进制的 65535 ,最后 char to int 需要补零 0b00000000000000001111111111111111 最后结果是 65535 。