这个java代码背后的逻辑是什么

我遇到了java线下面,并对其输出感到困惑。 你能解释一下这段代码背后的逻辑吗?

System.out.println((int)(char)(byte) -1); 

输出:

 65535 

嗯,这相当于:

 byte b = -1; char c = (char) b; // c = '\uFFFF' - overflow from -1 int i = c; // i = 65535 

实际上,在原始中显式转换为int只是为了使它调用System.out.println(int)而不是System.out.println(char)

我相信bytechar转换实际上是首先通过隐式扩展转换 – 所以它真的是这样的:

 byte b = -1; int tmp = b; // tmp = -1 char c = (char) tmp; // c = '\uFFFF' 

这些帮助有用?

它是一样的

System.out.println((int) '?');

  • (byte) -1给出:-1
  • (char) -1给出:?
  • (int) '?' 给出了65535

在java中, byte是一个带符号(二进制补码)的8位基本类型。 值为-1的byte的二进制表示是11111111 。 然后将其转换为char,这是一个16位原语,其值介于\u0000\uFFFF (0和65535)之间 – 看起来该字节的位左移8,带符号扩展。 所以在这一点上二进制表示是:

 1111111111111111 

…或65535.然而,它不是那么简单,因为“哦,是的,然后它变成了一个int所以我们看不到字符表示并打印出来”。 在java中,所有数字基元都已签名! 如果我们将char转换为另一个16位原语的short ,则程序将输出-1 。 但是,当我们将它转​​换为32位int 。 最终的二进制表示变为:

 00000000000000001111111111111111 

…这是签名和未签名的65535!